2011-07-11 15 views
0

どのようにして、きちんと親プロセスを取得して複数の子を作成しますか。それぞれの子はそれ自身のことを行う必要があります。また、子供は名前のないパイプを使って親とやりとりする必要があるので、ここではexecvを使うことはできないと思います。 複数の子供を育てる方法、それぞれの子供は別のことをしますか?

私はこのような何かを持っていた:

int main (int argc, const char * argv[]) 
{ 
    pid_t pids[2]; 

    int i; 
    for (i = 0; i < 2; ++i) { 
     if ((pids[i] = fork()) < 0) { 
      fprintf(stderr, "Error. Couldn't fork\n"); 
      exit(EXIT_FAILURE); 
     } else if (pids[i] == 0) { // child 
      if (i == 0) { 
       readerChild(); 
      } else { 
       writerChild(); 
      } 
     } 
    } 

    //parent stuff; 

    for (i = 0; i < 2; ++i) { 
     wait(NULL); 
    } 

    return 0; 
} 

が、私は一つだけを望んでいたとき、私の出力に応じて、2人のライターの子供たちが、作成されます。

答えて

2

あなたはfork()、親と子の両方が(fork()の戻り値以外)同じ状態で起動したときにことを覚えておいてください。したがって、子は外側のforループを実行し、独自の子を生成します(下の図を参照)。それを考慮に入れて制御フローを変更する必要があります。

P --> fork --> fork --> wait 
      |  --> writerChild -- wait 
      | 
      --> readerChild --> fork --> wait 
            --> writerChild --> wait 
0

個人的に私はちょうどそれがまだのコンテキスト内で実行されますので、readerChild()/ writerChild()ブロックスレッドと終了しない限り、readerChildは新しいwriterChildを起動します...子供一人当たり1つの関数を書きたいですそのループの。

1

これはあなたのコードで起こっていることです:

親のフォーク。私はまだ0なので、その子によってreaderChild()が呼び出されます。親と子はループの2番目の繰り返しを続けます。彼らは再びフォークします。したがって、あなたは2人の作家の子供を得ます。 1人は子供、もう1人は孫です。

子セクションの最後に、ループを防止する必要があります。置く:break;

関連する問題