我有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);
答案 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
仅在所有已创建的子项退出时才完成。