在Linux中,如果没有正常的系统调用,python如何确定PID呢?

问题描述 投票:0回答:1

运行以下命令时

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确实获得了这样的价值,这个电话究竟是如何实现的?

python linux system-calls strace vdso
1个回答
3
投票

除其他外,The way the vdso works将特定于进程的变量映射到vdso函数知道如何读取的用户空间。其中一个是当前进程ID,因此gettimeofday不需要进行系统调用来访问该信息。

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

© www.soinside.com 2019 - 2024. All rights reserved.