【发布时间】:2018-09-18 04:24:52
【问题描述】:
运行以下命令时
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 获得了这样的值,那么该调用实际上是如何进行的?
【问题讨论】:
-
strace -e trace=getpid -f python3 -c 'import os; print(os.getpid())'在我测试时显示了对 getpid 系统调用的两次调用。 -
@Shawn:很奇怪。我刚刚在两个不同的系统上使用额外的
trace=getpid测试了 strace(不幸的是,两者都是相同版本的 ubuntu,16.04)。两者都打印 PID,但没有显示对getpid的调用;只有 '+++ 以 0 +++ 退出'。 -
@Shawn:你用的是什么系统?是否启用了 vdso?
-
Arch 和 ubuntu 18.04。
-
@jww:也许吧,但从github.com/torvalds/linux/blob/v3.19/include/uapi/linux/… 看来,系统似乎没有将PID 作为辅助向量值公开给用户。 x86 值似乎也不包括 PID...它也没有解释为什么 ubuntu 18.04 进行调用而 16.04 没有:/
标签: python linux system-calls strace vdso