在Linux中,Python如何在没有正常系统调用的情况下确定PID?

时间:2018-09-18 04:24:52

标签: python linux system-calls strace vdso

运行以下命令时

strace -f python3 -c 'import os; print(os.getpid())'

我注意到strace无法捕获对getpid(2)系统调用的调用。我首先考虑到这是由于glibc缓存了pid,但是没有至少一个真实的系统调用,就不应有libc用于缓存的pid。然后我认为可能是vdso的元凶,但是运行一个通过libc进行此系统调用的C程序时,显示了getpid调用。我最终放弃了,并查找了os.getpid python模块的源代码,该模块显然似乎是在Modules/posixmodule.c中定义的。令我惊讶(以及随之而来的混乱)的是,它通常会调用getpid

所以我的问题是:python如何确定os.getpid的结果?并且如果确实通过调用getpid获得了该值,那么该调用实际上是如何进行的?

1 个答案:

答案 0 :(得分:3)

The way the vdso works尤其是将特定于进程的变量映射到vdso函数知道如何读取的用户空间中。其中之一是当前进程ID,因此gettimeofday无需进行系统调用即可访问该信息。

现在,专门针对getpid,它实际上不是VDSO调用。在2.25之前的glibc中,该库将缓存调用,并且由于部分Python运行时调用getpid,因此在第一个之后将不再对其进行调用。从2.25开始,该库不会缓存进程ID,因此每个getpid调用都会导致系统调用。