0

我有以下代码,我试图通过分叉创建子进程。我希望制作 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
4

2 回答 2

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"3 次,j等于0,12。父打印也是如此。

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

于 2013-09-23T18:10:27.787 回答
1

不要 fork()在循环中多次调用。

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

您应该在循环中:

const int pid = fork();
if(pid == 0)
{
  doSomething();
  exit();
}
于 2013-09-23T18:08:51.143 回答