运行以下命令时
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
获得了该值,那么该调用实际上是如何进行的?
答案 0 :(得分:3)
The way the vdso works尤其是将特定于进程的变量映射到vdso函数知道如何读取的用户空间中。其中之一是当前进程ID,因此gettimeofday
无需进行系统调用即可访问该信息。
现在,专门针对getpid
,它实际上不是VDSO调用。在2.25之前的glibc中,该库将缓存调用,并且由于部分Python运行时调用getpid
,因此在第一个之后将不再对其进行调用。从2.25开始,该库不会缓存进程ID,因此每个getpid
调用都会导致系统调用。