在Linux上,子进程的PID是否总是大于其父进程的PID?


22

可以说,从内核2.6开始。

我观察系统上所有正在运行的进程。

孩子的PID是否总是大于父母的PID?

是否可能有“反转”的特殊情况?

Answers:


47

不可以,因为非常简单的原因,PID可以具有最大值。如果进程的PID最高,则它派生的任何子进程都不能具有更大的PID。给孩子一个较低的PID的替代方法是fork()完全失败,这不是很有效。

PID是按顺序分配的,在使用最高的PID之后,系统会回绕以重用(免费的)较低的PID,因此在其他情况下,您也可以为孩子获得较低的PID。

我的系统(/proc/sys/kernel/pid_max)上的默认最大PID 仅为32768,因此达到折回的条件并不难。

$ echo $$
27468
$ bash -c 'echo $$'
1296
$ bash -c 'echo $$'
1297

如果您的系统是随机分配PID(而不是像OpenBSD那样),而不是连续分配(例如Linux),则有两种选择。要么在可能的PID的整个空间上进行随机选择,在这种情况下,很明显,孩子的PID可能低于父母的PID。或者,将从大于父母的PID的值中随机选择孩子的PID,这将平均使它介于父母的PID和最大值之间。然后,递归分叉的进程将迅速达到最大值,并且我们将处于与上述相同的位置:新的派生将需要使用较低的PID才能成功。


3
FWIW,有些系统中PID是随机分配的(例如,默认情况下是OpenBSD上的),我敢肯定我在Linux上也看到过类似的PID分配方案(或者至少看到了一个建议的方案)。
库萨兰达

@Kusalananda,是的,我认为在unix.SE上也对此存在疑问。我没有时间去挖掘它,但是据我所记得,Linux的用于随机PID选择的补丁已经过时了,被抛弃了。但这没关系:只要有一个(相对较低的)最大PID,一旦使用它,选择要么给出一个较低的PID,要么在派生上出错。
ilkkachu


2
@Massimo,在安全性问题中讨论了安全性方面。se:随机PID会带来更多安全性吗?
ilkkachu

1
@RonJohn,好吧,我没有其他Linux赋予的价值,但是它是可修改的,您可以在64位系统上将其设置为大约400万(4194304或2 ^ 22)。(这是数字,而不是字节数)
ilkkachu

8

另外,还存在使用内核通知并分叉以避免通过进程表扫描进行检测的安全漏洞的可能性;如果操作正确,则会导致您的过程具有较低的PID,并且过程工具看不到有问题的过程。

http://cve.circl.lu/cve/CVE-2018-1121

procps-ng,procps很容易因竞争条件而隐藏进程。由于内核的proc_pid_readdir()以升序返回PID条目,因此,占用较高PID的进程可以使用inotify事件来确定何时扫描进程列表,而fork / exec可以获取较低的PID,从而避免了枚举。一个没有特权的攻击者可以通过在读取/ proc / PID条目中利用竞争条件来隐藏procps-ng实用程序中的进程。此漏洞影响procps和procps-ng直至3.3.15版,较新的版本也可能会受到影响。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.