python如何在Linux中看似没有正常系统调用的情况下确定PID?
How does python determine the PID seemingly without normal system calls in Linux?
当运行下面的命令
strace -f python3 -c 'import os; print(os.getpid())'
我注意到 strace 没有捕捉到对 getpid
(2) 系统调用的调用。我首先认为这是由于 glibc 缓存了 pid,但是在没有至少一个真正的系统调用的情况下,不应该有 libc 缓存的 pid。然后我考虑也许 vdso 是罪魁祸首,但是 运行 一个通过 libc 进行此系统调用的 C 程序在 straced 时显示了一个 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
调用都会导致系统调用。
当运行下面的命令
strace -f python3 -c 'import os; print(os.getpid())'
我注意到 strace 没有捕捉到对 getpid
(2) 系统调用的调用。我首先认为这是由于 glibc 缓存了 pid,但是在没有至少一个真正的系统调用的情况下,不应该有 libc 缓存的 pid。然后我考虑也许 vdso 是罪魁祸首,但是 运行 一个通过 libc 进行此系统调用的 C 程序在 straced 时显示了一个 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
调用都会导致系统调用。