C Linux-Fork:pid重用

C Linux-Fork:pid重用,c,linux,fork,C,Linux,Fork,我编写以下程序是为了理解在没有wait()或waitpid()的情况下调用fork时的工作方式 这是我得到的输出-> total no. of processes created = 64901 fork: Cannot allocate memory 当我立即退出子进程时,我希望程序继续运行,fork()应该在pid>pid_max之后重新使用pid。为什么不会发生这种情况?退出的子进程会作为僵尸保留在进程表中。僵尸进程一直存在,直到其父进程调用wait或waitpid以获取其退出状态。此外

我编写以下程序是为了理解在没有wait()或waitpid()的情况下调用fork时的工作方式

这是我得到的输出->

total no. of processes created = 64901
fork: Cannot allocate memory

当我立即退出子进程时,我希望程序继续运行,fork()应该在pid>pid_max之后重新使用pid。为什么不会发生这种情况?

退出的子进程会作为僵尸保留在进程表中。僵尸进程一直存在,直到其父进程调用
wait
waitpid
以获取其退出状态。此外,还保留了相应的进程id,以防止其他新创建的进程复制它

在您的情况下,流程表变得太大,系统拒绝创建新流程


分叉进程,然后不检索其退出状态可以被视为资源泄漏。当父进程退出时,它们将被
init
进程采用,然后收获,但是如果父进程活得太久,系统就无法只移除一些僵尸,因为假定父进程应该在某个时候通过
wait
waitpid
对它们感兴趣,子进程也会持有一些类似内存的资源。但它们并没有被释放,因为父进程不能处理SIGCHLD信号,当它们退出时,子进程将发送该信号

这些子进程将变成僵尸


您可以使用“ps-aux”转储这些fd。

我很惊讶您没有完全使系统崩溃。通常有一个用户进程限制来避免这种行为和分叉炸弹
ulimit-u
应该会给您的系统带来很大的进程限制。这是您的系统中的一个主要漏洞。ulimit-u显示:31488。事实上,该程序甚至会在后续尝试中运行。
total no. of processes created = 64901
fork: Cannot allocate memory