【问题标题】:waiting for processes in parallel before running another set of processes with exec在使用 exec 运行另一组进程之前并行等待进程
【发布时间】:2014-02-22 10:43:18
【问题描述】:

我有 2 个并行运行的进程,然后是另外 4 个并行运行的进程。然后我等待它们完成,然后再启动另外 10 个并行运行的进程,然后等待它们完成,然后再让父进程完成。

这有时有效,但有时无效。特别是在最后,父级退出但其他程序仍在运行并在父级完成后打印内容。而且它真的很重复,我试着把它变成一个函数,但无法让它工作;所有进程并行运行或每组仅执行一个。有没有更好的方法来实现这一点?

    ...
waitpid(p1,0,0);
for(i = 0; i<4; i++) {
    switch(p1 = fork()) {
        case 0:
          execl("prog", "prog", NULL);
          exit(0);
        case -1:
          perror("fork");
          exit(1);
    }
}
waitpid(p1,0,0);

for(i = 0; i<10; i++) {
    switch(p1 = fork()) {
        case 0:
          execl("prog", "prog", NULL);
          exit(0);
        case -1:
          perror("fork");
          exit(1);
    }
}
waitpid(p1,0,0);

【问题讨论】:

    标签: c parallel-processing exec


    【解决方案1】:

    您需要等待所有孩子,但您当前的代码等待创建的最后一个孩子

    试试这个

    pid_t p1[10];
    int cnt;
    
    /* Replace every instance of your waitpid
     * with this one */
    cnt = i;
    for (i = 0; i < cnt; i++) {
      waitpid(p1[i], 0, 0);
    }
    

    哪个子节点先退出并不重要,for loop 仅在所有创建的子节点都退出时才完成。

    【讨论】:

    • @Duck 如果您将wait(NULL) 放入循环中,则循环将在创建下一个之前等待该过程完成,因此它们不会并行执行。
    猜你喜欢
    • 1970-01-01
    • 2016-09-09
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2018-11-19
    相关资源
    最近更新 更多