【发布时间】:2012-10-02 10:11:43
【问题描述】:
我创建了三个进程,我想同步它们的工作。具体来说,我希望第一个进程等待第二个,第二个等待第三个。基本上按照创建它们的相反顺序执行它们。
这是我到目前为止所做的。
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 来检查我在哪个子进程中,因为我假设我在子进程中得到了正确的 i,所以如果 i = 0,我实际上是第一个子进程。这个假设是真的吗?在任何情况下,我都没有得到我想要的顺序,实际上这些进程是按照它们的自然顺序执行的,绕过了我放置的 waitpid 调用。有任何想法吗?
【问题讨论】:
-
一定要这样吗?如果每个孩子都创建一个孩子,这会容易得多。正如您目前拥有的那样,没有孩子会知道它的弟弟妹妹,只有年纪较大的弟弟妹妹。 IOW,当父母创建child1时,child1是它自己的进程。该进程的 pid 表不会更新以反映更多的子进程。只有父母的 pid 表有所有信息。您的 waitpid() 调用可能在 ECHILD 上失败(您没有检查),这就是为什么它们似乎没有被执行。
-
我想通了。这是一个非常令人困惑的学校作业,因为教授特别要求我们不要让第一个叉子成为第二个等等,所以我很困惑。我想我会研究其他形式的 IPC,即使我们还没有进入那一章。谢谢。
标签: linux process fork waitpid