2017-01-31 5 views
2

パイプを理解しようとしています。私はパイプを使って親プロセスからその子プロセスにメッセージを送るこの小さなプログラムを持っています。子はすべての3つのメッセージを受信しますが、終了する代わりに、最後のメッセージを読んだ後にハングします。私は間違って何をしていますか?ありがとう。パイプから読み込んだ後にプログラムが停止しない

PS:私は親からwhileループで2秒間寝ると気になりました。

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 
#include <errno.h> 

int main(){ 

    int desc[2]; 
    pipe(desc); 

    int pid = fork(); 

    if(pid == 0){ 
     while(1){ 
      sleep(1); 
      char buffer[16]; 
      if(read(desc[0], buffer, 16) != 16){ 
       printf("Error or finished"); 
       exit(0); 
      }; 
      printf("Child: message recieved - '%s'\n", buffer); 
     } 
     close(desc[1]); 
    } 
    if(pid > 0){ 
     int i=0; 
     while(i <= 2){ 
      char buffer[100]; 
      i++; char x[10]; 
      strcpy(buffer, "Hello, child!"); 
      sprintf(x, " %d", i); 
      strcat(buffer, x); 
      if(write(desc[1], buffer, 16) != 16){ 
       printf("Error"); 
       exit(0); 
      }; 
     } 
     close(desc[0]); 
    } 
    return 0; 
} 

答えて

3

親と子でパイプの有用でない部分を閉じるのを忘れました。実際にあなたの子供はパイプの読み書き部分を持っているので、ライター(それ自身!)が存在するのでファイルの終わりを検出することができないので、読み込み中にブロックされます。あなたのコードがに変更します。

if(pid == 0){ 
    close(desc[1]); // Child is not a writer, so close the write part immediately! 
    while(1){ 
     ... 
    } 
} 
if(pid > 0){ 
    close(desc[0]); // Parent is not a reader, so close the read part immediately! 
    int i=0; 
    while(i <= 2){ 
     ... 
    } 
} 

エンド・オブ・ファイルは、「パイプを読み込むために多くの何も」ではない、パイプの上に「これ以上の作家を」のことを覚えておいてください。

3

パイプの端を正しく閉じる必要があります。パイプの書き込み終了がすべて終了するまで、リーダーは停止します。

if(pid == 0){ 
    close(desc[1]); // close write end in reader 
    while(1){ 
     ... 
     read(desc[0], buffer, 16); 
     ... 
    } 
} 
if(pid > 0){ 
    int i=0; 
    close(desc[0]); // close read end in writer; not required, but makes code cleaner 
    while(i <= 2){ 
     ... 
     write(desc[1], buffer, 16); 
     ... 
    } 
    close(desc[1]); // close write end in writer 
} 
+1

あなたは「ライターで書き込み終了を閉じる」が正しいですが、そのポイントの後に親が終了し、ファイル記述子が閉じられます。しかし+1は明白です。子供の出口機構は自然のように見えない。しかしそれは別の問題だと思います。 – usr

関連する問題