叉子和等待pid检查之外的孩子

时间:2014-04-22 13:26:40

标签: c linux process fork wait

我想制作两个平行的工作叉,最后等待它们完成。

 for (int i = 0; i < 2; i++) {
    pid_t pid = fork();

    if(pid < 0) {
        fprintf(stderr,"Cannot fork!");
        exit(EXIT_FAILURE);
    }
    else if(pid == 0) {
        switch(i)
        {
            case 0:
                //first child
                exit(EXIT_SUCCESS);
                break;
            case 1: 
                //second child
                exit(EXIT_SUCCESS);
                break;
        }
        break;
    }
    else {
        //parent
    }
}

问题是主程序在子程序之前终止。如果我将wait(0)添加到else父级部分,它会等待每个进程,因此它们不会同时工作,而是一个接一个地工作。 我假设我可以简单地在循环之后放置wait()或waitpid(),但这也不起作用。我认为在fork之后父进程正常继续,所以当wait()在循环和if-else结构之外时为什么不等待?

抱歉打扰并提前致谢。

1 个答案:

答案 0 :(得分:1)

如果在else父部分中添加wait(NULL),则父进程确实会等待第一个子进程在创建第二个子进程之前返回。

如果您在循环后添加wait(NULL),则父流程将等待,以便返回第一个子流程。

如果您希望所有子进程同时运行,则需要第二个循环,其中父进程将根据需要多次使用wait()来收集每个的退出状态子进程。

在您的情况下,有2个子进程,因此2个wait()系统调用就足够了。要添加的循环是这样的(我还添加了printf,以便您可以在stdout上观察它:

for (i = 0; i < 2; i++) {
    wait(NULL);
    printf("My child No %d died.\n", i);
}