2012-10-02 55 views
0

我创建了三个进程,我想同步他们的工作。具体来说,我希望第一个进程等待第二个,第二个等待第三个。基本上按照它们创建的相反顺序执行它们。子进程彼此等待

这是我到目前为止所做的。

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

你必须这样做吗?如果每个孩子都创造一个孩子,这会容易得多。正如你目前所看到的,没有一个孩子会知道年轻的兄弟姐妹,只是年龄较大的兄弟姐妹。 IOW,当父级创建child1时,child1是它自己的进程。该进程的pid表不会被更新以反映更多的孩子。只有父母的pid表具有所有信息。您的waitpid()调用可能在ECHILD上失败(您没有检查),这就是为什么它看起来没有被执行。 – Duck

+0

我想通了。这是一个非常混乱的学校任务,因为教授特别要求我们不要让第一个叉子等第二个,所以我很困惑。我想我会研究一些其他形式的IPC,即使我们还没有在这个章节中讨论过,也是如此。谢谢。 –

回答

0

不,你正在获得更多的3过程。

考虑一个简化版本(这只是删除等待...你做相同数量的叉):

for (i=0; i < 3 ; i++){ 
    pids[i] = fork(); 
} 

因为你做的叉里面一个for循环,无需检查返回值。父母和孩子都会得到自己的孩子。

[###############PARENT###############] 
      |   |   | 
     i=0   i=1   i=2 
      |   |   | 
     [ a0 ]  [ b0 ]  [ c0 ] 
     /\   | 
     i=1 i=2  i=2 
    / \  | 
    [a1] [a2] [ b1 ] 
     | 
    i=2 
     | 
    [a3] 

你必须检查fork返回值后打破循环。

+0

相信它或不是我的原始代码确实从循环中断开。无论如何,我添加了一个break语句,以防其子进程,现在,我的主要问题,是我写的代码应该有助于颠倒子进程的执行顺序是否正确? –

+0

新代码有帮助。 –

+0

是的,但我认为这里的问题是,有时第二个孩子没有等待,因为第二个孩子尚未创建(waitpid返回-1)。结果表明,一个过程不能等待使用这种技术的兄弟姐妹。感谢你的回答,但是它帮了很多。 –