如何分叉并创建特定数量的 children 来执行相同的任务?

How to fork and create a specific number of children that perform the same task?

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

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();
    }
 }

编辑: objective 是让所有 child 进程同时 运行。 parent 等待任何 child 进程退出。只要任何一个 child 进程退出,parent 进程就会打印退出的 child 的 pid。剩余的 child 个进程继续 运行 simulatenously 直到另一个 child 退出等等。如果我在循环外调用 parentProcess(),parent 只会在最后一个 child 进程退出时打印退出的 child 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();

否则,parent 依次等待每个 child,然后再 运行 下一个。

您应该在 parentProcess() 内的循环中使用 wait()waitpid() 来收集所有死去的 children — 您最好提供num_forks 作为 parentProcess() 的参数。或者你需要重新定义你想做什么。这个问题表明你想要 children 运行 同时,而 parent 等待他们全部死去。这意味着你必须在等待它们之前启动所有 children——前提是不会 运行 超出进程(所以 num_forks 是一个像 20 这样的正常数字,而不是像 2,000 这样的疯狂数字或 2,000,000)。

因此,您在 parentProcess() 中的代码应该大致如下,作为基本的最低限度:

void parentProcess(void)
{
    int status;
    int corpse;
    while ((corpse = wait(&status)) != -1)
        printf("%5d: 0x%.4X\n", corpse, status);
}

这应该在循环外调用。如果在循环内调用,parent 将启动一个 child,等待它完成,然后重复该过程。我假设 childProcess() 函数永远不会 returns;如果这样做会导致混乱 return.