这是一个纯粹的学术问题,因为这永远不会发生。
如果将PID存储为pid_t类型,而不是某些任意精度类型,则一次可以存在的PID数量受到限制。PID溢出时是否存在定义的行为?
65536进程会杀死/ sbin / init并引起内核崩溃吗?还是有一些安全措施?
fork
由于不存在而失败。 pid可用。
这是一个纯粹的学术问题,因为这永远不会发生。
如果将PID存储为pid_t类型,而不是某些任意精度类型,则一次可以存在的PID数量受到限制。PID溢出时是否存在定义的行为?
65536进程会杀死/ sbin / init并引起内核崩溃吗?还是有一些安全措施?
fork
由于不存在而失败。 pid可用。
Answers:
POSIX没有指定通过递增先前的PID获得每个新进程的PID。它只要求它是唯一的。
在每个PID都递增的系统上fork()
,我观察到这些值在达到某个上限后会回绕(以我的经验,这大约是2 15)。回绕之后,新的PID不会严格递增,因为某些PID值仍会在之前的循环中使用。
在您同时运行 2 N 个进程之前,应该不会有问题。我怀疑系统会在此之前很久就达到一定的容量限制。在这种情况下,fork()
系统调用将失败,并且可能设置errno
为EAGAIN
或ENOMEM
(man fork
以获取详细信息)。
实现的代码fork
可能会或可能不会检查是否有任何PID。它可能不会打扰,因为它假定系统资源在到达该点之前就已经用完,或者为了完整性和应对未来的可能性而进行了明确的检查。我没有检查过,如果有的话,我只能说我所看过的那个内核。
PID的最大限制远小于2^((sizeof(int)*CHAR_BIT)
。请参阅进程ID的最大值是多少?。换句话说,您的PID永远不会接近40亿。
当所有pid插槽都装满后,fork
调用将开始失败errno==EAGAIN
(请参阅fork(2))。如果您只是在不填充所有插槽的情况下直接到达顶部,则下一个PID将是1(init为1)之后的下一个空闲插槽