getpid 是如何工作的?

sau*_*405 7 process c system-calls

getpid系统调用返回调用进程的进程ID。内核如何确定哪个进程正在调用系统调用?

max*_*zig 11

内核进行作业调度并提供系统调用。

当一个进程运行时,内核调度它的运行时间——特别是它给它分配一个PID——这样的信息存储在内核地址空间内,在数据结构中(例如在任务结构内)。

因此,当一个进程调用getpid()系统调用时,内核只需要查看调用(即当前运行)进程的任务结构


jll*_*gre 7

当一个系统调用被执行时,有一个权限切换,即允许被执行的代码执行更多的指令和访问用户态代码禁止的数据。

但是没有进程上下文切换,因此内核代码仍在调用进程上下文中运行。这意味着内核不需要搜索哪个进程正在调用它,它已经知道了。getpid 系统调用代码只是从指向包含其自己的进程/线程特定信息的内部结构的指针中检索进程 ID。此结构取决于操作系统的实现。

例如,对于 Illumos (OpenSolaris),该结构被命名为 proc:http : //src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/sys/proc.h#131