Linux Fork:pid重用

Zax*_*ter 5 c linux fork

我编写了以下程序来了解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.为什么不这样呢?

Bla*_*iev 8

退出的子进程作为僵尸保留在进程表中.僵尸进程一直存在,直到父母调用waitwaitpid获得退出状态.此外,保留相应的进程ID,以防止其他新创建的重复进程.

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

分叉进程然后不检索它们的退出状态可以被视为资源泄漏.当父init进程退出时,它们将被进程采用然后收获,但如果父进程保持活动的时间太长,系统就无法删除一些僵尸,因为假设父进程应该得到通过wait或在某些时候对它们感兴趣waitpid.