2016-11-30 2 views
0

私の宿題は、4つの子プロセスを作成するCプログラムを記述し、各子が整数を使って何かをして、それと最後のものは変更された値を出力する必要があります。子供同士のコミュニケーションには匿名のパイプを使わなければならない。親プロセスには、子パイプ用のパイプを開く以外の作業はありません。私はプログラムを書いたが、最後の子を使って数字を印刷しようとすると面白い結果が出るという問題がある。 1つではなく8つの数字を表示します(実際には1つは正しいものです)。コードの一部は次のとおりです。パイプを使ってCの子プロセス間でデータを渡す

int pipe1[2]; 
int pipe2[2]; 
int pipe3[2]; 
pipe(pipe1); 
pipe(pipe2); 
pipe(pipe3); 

int j; 

close(pipe1[1]); //close pipes for writing on parent process 
close(pipe2[1]); 
close(pipe3[1]); 

for (j = 0; j < 4; j++) { 
    switch(fork()) { 
    case 0: 
     if (j == 0) { 
      int value = 100; 
      write(pipe1[1], &value, sizeof(int)); 
      close(pipe1[1]); 
     } 
     else if (j == 1) { 
      int value; 
      read(pipe1[0], &value, sizeof(int)); 
      close(pipe1[0]); 
      value = value * 10; 
      write(pipe2[1], &value, sizeof(int)); 
      close(pipe2[1]); 
     } 
    //and so on until the last process 
     else if (j == 3) { 
      int value; 
      read(pipe3[0], &value, sizeof(int)); 
      char buf[4] = {0}; 
      memset(buf, 0, sizeof(buf)); 
      snprintf(buf, sizeof(value), "%d ", value); 
      write(1, buf, strlen(buf)); 
     } 
     break; 
    } 
} 
close(pipe1[0]); 
close(pipe2[0]); 
close(pipe3[0]); 
sleep(1); 

int k; 

for (k = 0; k < 4; k++) { 
    wait(0); 
} 

1つ(と適切なもの)の出力を得るにはどうすればよいですか?

+0

あなたはbuf [5]が必要です。intが4バイト長であると仮定します。 – MayurK

答えて

1

あなたの子プロセスの1つが、あなたが提示したコードのbreakステートメントを実行するとどうなると思いますか?ヒント:終了しません。

また、あなたのパイプがそれほど機能しないのは疑問です。いずれかの子をフォークするの前に、そのうちの2つの書き込み終了(2回のうちの1回)を閉じます。それらは子供のために魔法のように再開されることはないので、彼らのパイプ全体は役に立たない。

+0

申し訳ありませんが、コードを編集しました...私はclose(pipe3 [1])を行っています..私は最後に_exit(0)が必要なswitch文とif文の前にパイプを閉じてはいけませんか? – Luki

+0

@Luki、親は、そのパイプエンドを使用する必要があるすべての子をフォークする前に、パイプエンドのコピーを閉じてはいけません。ループ終了後まで、すべてのクロージャを回避するのは簡単な方法です。あなたは、それぞれの子供が意図した仕事を完了したときに出るようにする必要があります。それぞれの 'if'ブロックに' _exit(0) 'を置くことはそれを達成する一つの方法です。 –

+0

私はそれを解決しました:)非常に明確な答えをありがとう。 – Luki

関連する問題