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.getpidpython模块的源码,貌似是在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 调用都会导致系统调用。