我编写了以下程序来了解fork在没有wait()或waitpid()的情况下调用的方式 .
int main()
{
pid_t childpid;
int retval = 0;
int i;
while(1){
//usleep(1);
childpid = fork();
if (childpid >= 0)
{
i++;
if (childpid == 0)
{
exit(retval);
}
else
{
//printf("childpid is %d\n", childpid);
}
}
else
{
printf("total no. of processes created = %d\n", i);
perror("fork");
exit(0);
}
}
}
这是我得到的输出 - >
total no. of processes created = 64901
fork: Cannot allocate memory
我期待程序继续进行,因为我现在正在退出子进程,而fork()应该在pid> pid_max之后重用pids . 为什么不这样呢?
2 回答
子进程也拥有内存等资源 . 但它们不会被释放,因为父进程无法处理SIGCHLD信号,这些信号将在子进程退出时发送 .
那些子进程将变成僵尸 .
您可以使用“ps -aux”来转储那些fd .
退出的子进程作为僵尸保留在进程表中 . 僵尸进程一直存在,直到其父级调用
wait
或waitpid
来获取其退出状态 . 此外,保留相应的进程ID,以防止其他新创建的重复进程 .在您的情况下,进程表变得太大,系统拒绝创建新进程 .
分叉进程然后不检索它们的退出状态可以被视为资源泄漏 . 当父进程退出时,它们将被
init
进程采用然后收获,但如果父进程保持活动太长时间,则系统无法移除某些僵尸,因为假设父进程应该通过wait
或waitpid
在某些时候对它们感兴趣 .