Massimo Asked: 2018-09-05 02:59:57 +0800 CST2018-09-05 02:59:57 +0800 CST 2018-09-05 02:59:57 +0800 CST 在 Linux 上,子进程的 PID 是否总是大于其父进程的 PID? 772 比方说,从内核 2.6 开始。 我观察系统上所有正在运行的进程。 孩子的 PID 是否总是大于父母的 PID? 是否有可能出现“反转”的特殊情况? linux-kernel process 2 个回答 Voted Best Answer ilkkachu 2018-09-05T03:09:03+08:002018-09-05T03:09:03+08:00 不,原因很简单,PID 可以有一个最大数值。如果一个进程的 PID 最高,则它派生的任何子进程都不能有更大的 PID。给孩子一个较低的PID的替代方法是fork()完全失败,这不会很有成效。 PID 是按顺序分配的,在使用最高的 PID 后,系统会重新使用(免费的)较低的 PID,因此在其他情况下您也可以为孩子获得较低的 PID。 我的系统 ( ) 上的默认最大 PID/proc/sys/kernel/pid_max仅为 32768,因此不难达到发生回绕的条件。 $ echo $$ 27468 $ bash -c 'echo $$' 1296 $ bash -c 'echo $$' 1297 如果您的系统要随机分配 PID(如 OpenBSD 似乎这样做)而不是连续分配(如 Linux),则有两种选择。要么在可能的 PID 的整个空间上进行随机选择,在这种情况下,很明显孩子的 PID 可能低于父母的 PID。或者,子 PID 将从大于父 PID 的值中随机选择,平均而言,它会介于父 PID 和最大值之间。递归分叉的进程将很快达到最大值,我们将处于与上述相同的点:新的分叉需要使用较低的 PID 才能成功。 thrig 2018-09-05T06:21:54+08:002018-09-05T06:21:54+08:00 此外,使用内核通知和分叉自己以避免被进程表扫描检测到,也存在潜在的安全漏洞;如果做得正确,这会导致您的进程具有较低的 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,较新的版本也可能受到影响。
不,原因很简单,PID 可以有一个最大数值。如果一个进程的 PID 最高,则它派生的任何子进程都不能有更大的 PID。给孩子一个较低的PID的替代方法是
fork()
完全失败,这不会很有成效。PID 是按顺序分配的,在使用最高的 PID 后,系统会重新使用(免费的)较低的 PID,因此在其他情况下您也可以为孩子获得较低的 PID。
我的系统 ( ) 上的默认最大 PID
/proc/sys/kernel/pid_max
仅为 32768,因此不难达到发生回绕的条件。如果您的系统要随机分配 PID(如 OpenBSD 似乎这样做)而不是连续分配(如 Linux),则有两种选择。要么在可能的 PID 的整个空间上进行随机选择,在这种情况下,很明显孩子的 PID 可能低于父母的 PID。或者,子 PID 将从大于父 PID 的值中随机选择,平均而言,它会介于父 PID 和最大值之间。递归分叉的进程将很快达到最大值,我们将处于与上述相同的点:新的分叉需要使用较低的 PID 才能成功。
此外,使用内核通知和分叉自己以避免被进程表扫描检测到,也存在潜在的安全漏洞;如果做得正确,这会导致您的进程具有较低的 PID,并且进程工具看不到有问题的进程。
http://cve.circl.lu/cve/CVE-2018-1121