在循环中分叉并不像想象的那样工作

时间:2011-10-21 22:56:13

标签: c loops fork

我希望主进程能够运行并创建4个子进程。一旦创建它们,我希望主进程等待它们完成。

这是我的全部代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>


int main(){

    int i;
    int childID;
    int status;

    for (i=0;i<4;i++){
        childID=fork();
        if (childID==0){
            printf("[%d] I the child, will sleep\n", (int)getpid());
            sleep(1);
        }
    }

    if (!childID){
        wait(&status);
        printf("[%d] I the parent, have waited for my children!\n", (int)getpid());
    }

    return 0;
}

我得到的是:

..
[8508] I the child, will sleep
[8503] I the parent, have waited for my children!
[8511] I the child, will sleep
[8510] I the child, will sleep
[8509] I the child, will sleep
[8520] I the child, will sleep
[8511] I the parent, have waited for my children!
[8510] I the parent, have waited for my children!
(prompt stuck)

为什么父母打印多次而不是一次打印?

3 个答案:

答案 0 :(得分:3)

父母不是多次写作,而是前三个孩子。当你fork时,孩子们会得到一个过程的精确副本,包括地址空间,堆栈,寄存器,一切。这意味着在第一个fork之后,父母和新孩子将经历for 3次,再创建3个新孩子。作为孩子执行期望效果时,您应breakfor开出:

    if (childID==0){
        printf("[%d] I the child, will sleep\n", (int)getpid());
        sleep(1);
        break;
    }

答案 1 :(得分:1)

看看印刷品的pids。 8510和8511是孩子,而不是原来的父母。当您在循环中进行分叉时,子进程也处于该循环中。尝试在睡眠后放置break;(1)。

答案 2 :(得分:0)

当你运行循环时,一旦你分叉,孩子在分叉后的第一次迭代中会睡觉,但随后会分叉更多的进程。由于childID对于这些流程不再是0,因此不会调用等待,因此他们不会收获他们的孩子。这意味着当所有等待调用完成后,您仍将运行进程,因此终端将挂起。