C Linux-Fork:pid重用
我编写以下程序是为了理解在没有wait()或waitpid()的情况下调用fork时的工作方式 这是我得到的输出->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以获取其退出状态。此外
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