首页 > 解决方案 > python如何在Linux中看似没有正常系统调用的情况下确定PID?

问题描述

运行以下命令时

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

我注意到 strace 没有捕获对getpid(2) 系统调用的调用。我首先认为这是由于 glibc 缓存了 pid,但是如果没有至少一个真正的系统调用,就不应该有一个 pid 供 libc 缓存。然后我认为可能是 vdso 是罪魁祸首,但是运行一个通过 libc 进行此系统调用的 C 程序会getpid在跟踪时显示调用。终于放弃了,查了一下os.getpidpython模块的源码,貌似是定义在Modules/posixmodule.c. 令我惊讶的是(以及随后的困惑),它正常调用getpid!

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

标签: pythonlinuxsystem-callsstracevdso

解决方案


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

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


推荐阅读