在使用exec运行另一组进程之前,并行等待进程

时间:2014-02-22 02:01:36

标签: c parallel-processing exec

我有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);

1 个答案:

答案 0 :(得分: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仅在所有已创建的子项退出时才完成。