【问题标题】:How to fork and create a specific number of children that perform the same task?如何分叉和创建执行相同任务的特定数量的孩子?
【发布时间】:2015-05-02 10:10:37
【问题描述】:

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

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。其余子进程继续模拟运行,直到另一个子进程退出,依此类推。如果我在循环之外调用 parentProcess(),则父进程只会在最后一个子进程退出时打印退出的子 pid。

【问题讨论】:

    标签: c fork wait


    【解决方案1】:

    您需要将调用移至循环外的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();
    

    否则,父母会在运行下一个之前依次等待每个孩子。

    您应该在parentProcess() 内的循环中使用wait()waitpid() 来收集所有死去的孩子——您最好将num_forks 作为parentProcess() 的参数提供。或者你需要重新定义你想要做的事情。该问题表明您希望孩子们同时跑步,而父母则等待他们全部死亡。这意味着您必须在等待它们之前启动所有子进程——前提是进程不会用完(所以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);
    }
    

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

    【讨论】:

    • 但是我只到达 parentProcess 一次。每次任何孩子返回时,我都需要 parentProcess() 打印一些东西。我正在使用wait(&amp;exit_id) 等待子进程完成。顺便说一句,这是家庭作业,我希望你解释这个概念而不是给我代码。不幸的是,我的教授不是很有帮助。
    • 您应该在parentProcess() 内的循环中使用wait()waitpid() 来收集所有死去的孩子。或者你需要重新定义你想要做的事情。该问题表明您希望孩子们同时跑步,而父母则等待他们全部死亡。这意味着您必须在等待它们之前启动所有子进程——前提是不会耗尽进程(所以num_forks 是一个像 20 这样的合理数字,而不是像 2,000 或 2,000,000 这样的疯狂数字)。
    • 我相信我现在已经解决了乔纳森。在创建子进程的那个循环之后,我有一个单独的 for 循环,我再次循环 num_forks 次并每次调用 parentProcess()。如果您将其添加到您的答案中,我会很乐意接受它作为答案。谢谢。
    • 查看更新——parentProcess() 的替代实现,它将循环嵌入到函数中,而不是在for 循环之后。您当然可以在for 循环之后而不是在函数中编写while 循环,但坦率地说,该函数可能更简洁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2018-10-16
    • 2023-01-20
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多