儿童进程互相等待

时间:2012-10-02 10:11:44

标签: linux process fork waitpid

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

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

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调用。有任何想法吗?

1 个答案:

答案 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的返回值后,您必须打破循环。