2016-04-07 7 views
2

子どもでは、fifo "sample"に書き込んで親で読み込みます。以下のコードでは、親が端末「sample」を書き込んで待機していますが、読み取り機能から終了しません。名前付きパイプから読み取られたCは終了しません

pid_t p; 
int fd; 
char str[]="sample"; 
char ch; 

mkfifo("myfifo", FIFO_PERMS); 
fd = open("myfifo", O_RDWR); 
p=fork(); 

if(!p){ 

    printf("write %d byte\n", write(fd, str, 6)); 
} 
else{ 

    wait(NULL); 
    while(read(fd, &ch, 1)>0) 

     write(STDOUT_FILENO, &ch, 1); 

    close(fd); 

    unlink("myfifo"); 
} 

答えて

5

のファイル記述子がまだあなたはO_RDWRでそれを開いてから、書き込みのためにオープンし、両方のプロセスとそれを共有しているので、これは、ケースです。あなたは、このような、たとえば、ファイルディスクリプタのみ読み取り処理の読み込みのためにオープンされていることを、確認する必要があります。

pid_t p; 
char str[]="sample"; 
char ch; 

mkfifo("myfifo", FIFO_PERMS); 
p=fork(); 

if(!p){ 
    int fd = open("myfifo", O_WRONLY); 

    printf("write %d byte\n", write(fd, str, 6)); 
} 
else{ 
    int fd = open("myfifo", O_RDONLY); 

    wait(NULL); 
    while(read(fd, &ch, 1)>0) 

     write(STDOUT_FILENO, &ch, 1); 

    close(fd); 

    unlink("myfifo"); 
} 

理由:read()をパイプに最後のファイル記述子が書き込み用に開かれたときにのみEOFを返します。あなたが読んだファイル記述子もまた書き込み用に開かれたときは決してありません(O_RDWR

関連する問題