我创建了三个进程,我希望同步他们的工作。具体来说,我希望第一个进程等待第二个进程,第二个进程等待第三个进程。基本上按照创建它们的相反顺序执行它们。
这是我到目前为止所做的。
for (; i < 3 ; i++){
pids[i] = fork();
if (pids[i] == 0)
break;
}
if (pids[i] != 0){
wait(); // Main thread has to wait..
}
else{
if (i == 0){
waitpid(pids[1], &status, 0);
printProcessInfo(0);
}
else if (i == 1){
waitpid(pids[2], &status, 0);
printProcessInfo(1);
}
else if (i == 2){
printProcessInfo(2);
}
}
我正在使用我来检查我在哪个子进程,因为我假设我在子进程中得到正确的i,所以如果我= 0,我实际上是在第一个孩子。这个假设是真的吗?在任何情况下,我都没有得到我想要的订单,实际上流程按照自然顺序执行,绕过我放置的waitpid调用。有任何想法吗?
答案 0 :(得分:0)
不,你得到的是3个以上的过程。
考虑一个简化版本(这只是删除等待...你做相同数量的fork):
for (i=0; i < 3 ; i++){
pids[i] = fork();
}
因为你在for循环中执行fork,而不检查返回值。父母和孩子都会得到自己的孩子。
[###############PARENT###############]
| | |
i=0 i=1 i=2
| | |
[ a0 ] [ b0 ] [ c0 ]
/ \ |
i=1 i=2 i=2
/ \ |
[a1] [a2] [ b1 ]
|
i=2
|
[a3]
在检查fork
的返回值后,您必须打破循环。