运行以下命令时
strace -f python3 -c 'import os; print(os.getpid())'
我注意到strace没有接到对getpid
(2)系统调用的调用。我首先认为这是由于glibc缓存了pid,但是如果没有至少一个真正的系统调用,libc就不应该有缓存。然后我认为可能vdso是罪魁祸首,但运行一个C程序,通过libc进行系统调用时会显示一个getpid
调用。我终于放弃了,查看了os.getpid
python模块的来源,显然似乎是在Modules/posixmodule.c
中定义的。令我惊讶的是(以及随后的混乱),它正常打电话给getpid
!
所以我的问题是:python如何确定os.getpid
的结果?如果通过致电getpid
确实获得了这样的价值,这个电话究竟是如何实现的?
除其他外,The way the vdso works将特定于进程的变量映射到vdso函数知道如何读取的用户空间。其中一个是当前进程ID,因此gettimeofday
不需要进行系统调用来访问该信息。
现在,特别是对于getpid
,它实际上不是VDSO电话。在2.25之前的glibc中,库会缓存调用,并且由于Python运行时的一部分调用getpid
,因此在第一次调用之后不会调用它。从2.25开始,库不会缓存进程ID,因此每个getpid
调用都会导致系统调用。