我编写了以下程序来了解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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出 - >
total no. of processes created = 64901
fork: Cannot allocate memory
Run Code Online (Sandbox Code Playgroud)
我期待程序继续进行,因为我现在正在退出子进程,而fork()应该在pid> pid_max之后重用pids.为什么不这样呢?
退出的子进程作为僵尸保留在进程表中.僵尸进程一直存在,直到父母调用wait或waitpid获得退出状态.此外,保留相应的进程ID,以防止其他新创建的重复进程.
在您的情况下,进程表变得太大,系统拒绝创建新进程.
分叉进程然后不检索它们的退出状态可以被视为资源泄漏.当父init进程退出时,它们将被进程采用然后收获,但如果父进程保持活动的时间太长,系统就无法删除一些僵尸,因为假设父进程应该得到通过wait或在某些时候对它们感兴趣waitpid.
| 归档时间: |
|
| 查看次数: |
749 次 |
| 最近记录: |