首页 文章

Linux Fork:pid重用

提问于
浏览
5

我编写了以下程序来了解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 回答

  • 1

    子进程也拥有内存等资源 . 但它们不会被释放,因为父进程无法处理SIGCHLD信号,这些信号将在子进程退出时发送 .

    那些子进程将变成僵尸 .

    您可以使用“ps -aux”来转储那些fd .

  • 7

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

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

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

相关问题