如何产生多个孩子,每个孩子做不同的事情?

时间:2011-07-11 21:40:19

标签: c linux synchronization fork

你如何干净利落地获得一个父进程来创建多个孩子,每个孩子都必须自己做。孩子们还必须使用未命名的管道与父母沟通,所以我不认为execv可以在这里使用。

我有这样的事情:

int main (int argc, const char * argv[])
{
    pid_t pids[2];

    int i;
    for (i = 0; i < 2; ++i) {
        if ((pids[i] = fork()) < 0) {
            fprintf(stderr, "Error. Couldn't fork\n");
            exit(EXIT_FAILURE);
        } else if (pids[i] == 0) { // child
            if (i == 0) {
                readerChild();
            } else {
                writerChild();
            }
        }
    }

    //parent stuff;

    for (i = 0; i < 2; ++i) {
        wait(NULL);
    }

    return 0;
}

但是根据我的输出,当我只想要一个时,会创建两个作家孩子。

3 个答案:

答案 0 :(得分:2)

请记住,当您fork()时,父母和子女都会以相同的状态启动(fork()的返回值除外)。因此,孩子也将执行你的外部for循环,并产生自己的孩子(见下图)。您需要更改控制流程以考虑到这一点。

P --> fork --> fork --> wait
           |        --> writerChild -- wait
           |
           --> readerChild --> fork --> wait
                                    --> writerChild --> wait

答案 1 :(得分:1)

这是您的代码中发生的事情:

父母分叉。我仍然是0,所以这个孩子会调用readerChild()。父和子继续循环的第二次迭代。他们又两次分叉了。这样你就会得到2个作家的孩子其中一个是孩子,一个是孙子。

在您的子部分结束时,您需要阻止它循环。放一个break;

答案 2 :(得分:0)

我个人每个孩子只写一个函数...除非readerChild()/ writerChild()阻塞线程并退出,readerChild将生成一个新的writerChild,因为它仍将在该循环的上下文中执行。