让子进程等待另一个for循环

时间:2014-02-18 19:46:32

标签: c unix process fork

我一直在谷歌搜索我的问题2天,但我完成了它。我有关于进程管理,fork等的非常基本的信息。我被告知要创建一个相同父进程的子进程,并使用管道发送它们的种子,这样它们就可以生成一些随机数,这些都是为了自己的。但我一直坚持创建儿童流程。

for (i = 0; i < NUM_PLAYERS; i++) {
    /* TODO: spawn the processes that simulate the players */
    switch(pid = fork()){
        case -1:  // ERROR
            exit(EXIT_FAILURE);

        case 0:  // CHILD PROCESS
            printf("My parent id is %d \n", getppid());
            exit(EXIT_SUCCESS);

        default: // PARENT PROCESS
            wait(NULL);
    }
}

当我使用这段代码时,父级会创建NUM_PLAYERS个孩子,但我似乎无法在另一个for循环中使用它们,因为它们已经在案例0的末尾终止了。当我只删除{{1行,创建了很多进程,它们拥有所有不同的父进程。所以我的问题是,如何正确创建子进程并在以后使用它们?

2 个答案:

答案 0 :(得分:3)

如果删除exit(EXIT_SUCCESS),您的孩子将继续执行分叉的位置,IE将返回for()循环的近大括号,并自行生成新的子项。你想让孩子做什么?您应该这样做,然后执行exit(EXIT_SUCCESS)并且不要让它返回for()循环。

另请注意,wait()只会等待一个进程退出。

答案 1 :(得分:2)

void do_something()
{
    //create random numbers or whatnot
}

// ...........

case 0:  // CHILD PROCESS
    printf("My parent id is %d \n", getppid());
    do_something();
    exit(EXIT_SUCCESS);

在稍后的循环中,您需要父项wait的子项。您拥有它的方式将阻止,直到一个孩子返回。您希望在wait之前创建多个子项。

请注意,您仍然需要添加管道逻辑,以便父/子可以进行通信。

修改

这是您需要做的大致概述:

for (i = 0; i < NUM_PLAYERS; i++) {
    /* TODO: spawn the processes that simulate the players */
    switch(pid = fork()){
        case -1:  // ERROR
            exit(EXIT_FAILURE);

        case 0:  // CHILD PROCESS
            printf("My parent id is %d \n", getppid());
            exit(EXIT_SUCCESS);
    }
}

// only the parent will ever execute below here

for (i = 0; i < NUM_PLAYERS; i++) 
{
    while ( /* read each child's pipe*/)
    {
        //do something with data
    }
}

for (i = 0; i < NUM_PLAYERS; i++) 
    wait(NULL);

return(0);