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 检查我所在的子进程,因为我假设我在子进程中得到了正确的 i,所以如果 i = 0,我实际上是第一个子进程。这个假设是真的吗?在任何情况下,我都没有得到我想要的顺序,实际上这些进程是按照它们的自然顺序执行的,绕过了我放置的 waitpid 调用。有任何想法吗?

4

1 回答 1

0

不,您将获得 3 个以上的过程。

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

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

于 2012-10-02T10:21:52.233 回答