我需要编写一个C程序,在给定的次数内调用fork()。每个子进程都需要执行相同的任务(添加一些随机数,直到达到给定的和)。父进程等待直到所有子进程退出。我已经编写了下面的代码,但是我的输出显示,在第一个代码完成之前,另一个孩子不会开始执行它的代码。

for (i = 0; i < num_forks; i++) {
    child_pid = fork();
    if (child_pid < 0) {
        perror("fork\n");
    } else if (child_pid ==  0) {
        childProcess(i, goal);
    } else {
        parentProcess();
    }
 }

编辑:目标是让所有子进程同时运行。父进程等待任何子进程退出。一旦任何一个子进程退出,父进程就会打印出退出的孩子的PID。剩下的子进程继续模拟运行,直到另一个孩子退出,等等。如果在循环外调用父进程(),父进程只打印上次子进程退出时退出的子PID。

最佳答案

您需要将调用移动到循环之外的parentProcess()

for (i = 0; i < num_forks; i++) {
    child_pid = fork();
    if (child_pid < 0) {
        perror("fork\n");
    } else if (child_pid ==  0) {
        childProcess(i, goal);
    }
}
parentProcess();

否则,父进程将依次等待每个子进程,然后运行下一个子进程。
您应该在wait()中使用waitpid()parentProcess()循环来收集所有死去的孩子,并且您最好提供num_forks作为parentProcess()的参数。或者你需要重新定义你想做什么。这个问题表明,你希望孩子们同时奔跑,而父母则等待他们全部死去。这意味着您必须在等待它们之前启动所有的子进程-除非进程没有用完(所以num_forks是一个像20这样的正常数字,而不是像2000或2000000这样的疯狂数字)。
因此,您在parentProcess()中的代码应该大致如下,作为基本的最低要求:
void parentProcess(void)
{
    int status;
    int corpse;
    while ((corpse = wait(&status)) != -1)
        printf("%5d: 0x%.4X\n", corpse, status);
}

这应该在循环之外调用。如果在循环内调用,父级将启动一个子级,等待它完成,然后重复该过程。我假设childProcess()函数永远不会返回;如果它返回,将导致混乱。

关于c - 如何派生并创建特定数量的执行相同任务的子代?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28803339/

10-12 16:15