0

3つのプロセスを作成し、それらの作業を同期させたいと思います。具体的には、最初のプロセスが2番目、2番目が3番目で待機するようにします。基本的に、作成されたのとは逆の順序で実行します。

これが私がこれまでにしたことです。

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ループ内でフォークを実行するためです。親と子の両方が独自の子を取得します。

    [###############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 に答える