我有一个有点愚蠢的问题,如果我创建了一系列进程......这些不一定是某种继承,进程的 pid 必须是数字连续或随机 pid?
7 回答
这是由操作系统决定的。
通常,它们通常由操作系统按顺序分配。但是,这种行为不是决策的基础,因为大多数操作系统规范都声明进程 ID 分配不是确定性的(即:它可能是随机的,并且可能在未来的版本中发生变化等)。
在 Linux 上,pid 通常在系统范围内按顺序分配,但它们会定期回绕,并且可能存在由其他不相关进程引起的“间隙”。在极端情况下,您可能有足够宽的“间隙”来导致这种环绕。所以不要假设任何特定的顺序 - 而是明确地跟踪您的父或子进程的 PID。
以下是测试系统功能的方法:
for i in $(seq 20); do ps; done | grep ps
“ps”命令的 PID 是连续的进程,或者与任何其他调用者合理预期能够产生的接近连续的进程一样。
我在 Windows 上的 cygwin 终端随机分配它们,我的网络主机按顺序分配它们(偶尔会有间隙,可能是其他用户或服务器运行的进程)。
有些人认为顺序 PID 分配可能是一个轻微的安全问题,因为它可能会在多用户系统的用户之间泄漏信息。
在 AIX 上,您经常会看到更大(例如 7 位)的 PID,它们不一定是半顺序分配的(尽管我在测试时似乎以 2 为增量循环;机器上有另一个用户,所以它可能意义不大)。
在 AIX 5.3 机器上重新登录:
$ ps
PID TTY TIME CMD
1060910 pts/27 0:00 -ksh
1155224 pts/27 0:00 ps
$
取决于您的平台,但您不应该依赖于您的 pid 的任何特定顺序。
在 Windows 上,pid 通常分配的数量越来越多,但是当进程退出时,pid 可以被回收,您会看到新进程的 pid 低于旧进程的情况。此外,pid 来自与 tid 相同的命名空间,因此当您启动新进程时,您不会看到 pid 增加 4。
从您的角度来看,它们将是随机的。系统管理这些编号并在创建流程时分配它们。快速浏览一下我系统上当前的 PID,发现它们都可以被 4 整除……
如果你正在创建那些你会知道 pid 的孩子,pid 取决于操作系统调度程序,你不关心这些东西。