Linux 中的 PID 重用可能性

Ath*_*iri 11 linux process linux-kernel

在 Linux 操作系统中,PID 是否有可能被重用?

例如,一个 PID 被命名为 2252。这个 PID 是死的并从内核进程表中删除。进程表是否有可能为新进程重新使用相同的 PID,或者它不会在任何即将到来的进程中使用?

Sté*_*las 12

当然。否则,系统每次引导只能运行 32768 个进程(或系统上的最大 pid 数)。

只要一个进程已经死亡并且已经被等待(由它的父进程,或者子进程的收割者或 init 如果父进程已经死亡),它的 pid 就可以被重用。

您会看到脚本执行以下操作:

cmd1 & pid1=$!
something else
cmd2 & pid2=$!
more things
kill "$pid1" "$pid2"
Run Code Online (Sandbox Code Playgroud)

这些是近似值,因为 shell(大多数 shell)语言没有为您提供任何更好的 API 来处理子进程。

如果这些进程可能已经死亡,则无法保证$pid1和/或$pid2仍会引用较早启动的进程。$pid1并且$pid2也可能相同(如果cmd1cmd2开始时已经死亡)。所以kill可能会杀死错误的进程。

在实践中,这很少成为问题,尤其是在按顺序分配 pid 的系统上,因为 pid 编号需要相当长的时间来包装。但是当 pid 表变满时(比如当它充满僵尸进程时),它可能会变成这样,并且一些攻击者可以利用这一点。