C分叉的进程一直显示在'ps -a'输出中

时间:2018-09-15 11:12:41

标签: c process fork

我试图了解fork()的工作方式。这是我整理的一段代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(){
    while(1){
        if( fork() == 0){
            printf( "%s\n", "this is child process" );
            exit(0);
        }
        sleep(1);
    }
}

输出正是我所期望的(每秒一次“这是子进程”),所以我想所有子进程都会在需要它们时退出,但是只要我在程序运行时运行“ ps -a”运行时,我看到进程列表以每秒一的速度增长。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

在成为僵尸之前,该过程变为僵尸。当父进程调用wait时会发生这种情况。

由于子进程立即退出,因此您也可以调用wait而不会阻塞太多:

while(1){
    if( fork() == 0){
        printf( "%s\n", "this is child process" );
        exit(0);
    }
    wait(NULL);
    sleep(1);
}

这些僵尸的存在是为了保留可以在父进程上传递的信息,例如子进程退出代码。

如果父进程退出时没有收获其子代,那么孤立的子代将成为init进程的子代,它将在这些子代上收获(call等待`)。