防止大孩子在C中分叉

时间:2013-09-23 18:06:59

标签: c fork grandchild

我有以下代码,我试图通过分叉创建子进程。我希望确实有3个子流程。然而,当我运行代码时,我似乎变得越来越多,可能是因为孩子们处理分叉孙子。我在这里错过了什么,我该如何防止这种情况。

代码:

   for(j = 0; j < 3 ; j++){
    if((pid = fork()) == 0){            // child process
        dosomething();
        exit(0);                // terminate child process
    }
    else if((pid = fork()) > 0){
        printf("I'm in parent of the client spawn loop\n");
//      exit(0);    
    } 
}

输出:

I'm in parent of the client spawn loop
I'm in parent of the client spawn loop
I'm in parent of the client spawn loop
I'm in parent of the client spawn loop
I'm in parent of the client spawn loop
I'm in parent of the client spawn loop
I'm in parent of the client spawn loop

2 个答案:

答案 0 :(得分:5)

不要进行第二次fork通话,因为它会创建一个新的孩子。第一个就足够了:

for (j = 0; j < 3; ++j)
{
    pid_t pid = fork();
    if (pid == 0)
    {
        printf("In child (j = %d)\n", j);
        exit(0);
    }
    else if (pid > 0)
    {
        printf("In parent (j = %d)\n", j);
    }
}

将打印"In child"三次,j等于012。父母印刷也一样。

在您的真实代码中,您应该检查错误。

答案 1 :(得分:1)

请勿在循环中多次调用fork()

父母不应该再次呼叫fork(),这将创建另一个孩子,并引入另一个子父母分裂点。

你应该在循环中:

const int pid = fork();
if(pid == 0)
{
  doSomething();
  exit();
}