2012-04-02 12 views
2

プログラムはパイプからすべてのデータを読み取ることができます。しかし、プログラムはただ停止します。処理を続行できません。私はそれが子プロセスで止まると思います。c pipe:プログラムはwait(NULL)の前に停止します。

//I created two pipe before fork (fd[0] and fd[1]). 
//child process 
if(pid == 0){ 
    close(fd[a][1]); 
    buf[6]; 
    int i; 
    while ((i = read(fd[a][0], buf, 6)) > 0) { 
     printf("%s", buf);  
    } 
    close(fd[a][0]); 
exit(0); 
} 

//parent process 
write(fd[a][1], "12", 2); 
write(fd[a][1], "14", 2); 
write(fd[a][1], "15", 2); 
write(fd[b][1], "12", 2); 
write(fd[b][1], "14", 2); 
write(fd[b][1], "15", 2); 
printf("done!\n"); 
close(fd[0][1]); 
close(fd[1][1]); 
wait(NULL); 
printf("Really done!!!\n"); 
...      // The program cannot run after wait(NULL); 

--output-- 
121415done 
+2

完全な例ができますか? http://sscce.org/ –

+0

を参照してください。@Joachim Pileborg私のプログラムの詳細を提供しました。 –

答えて

0

あなたは、何か問題が発生するまで、効果的に自分自身をブロックし、whileループでreadを発行しています。あなたが6文字を読むために必要がある場合、これはあなたが子プロセスを記述する方法を次のとおりです。

char buf[7]; 
int left = 6; 
int so_far = 0; // instead of so_far, (6 - left) could also be used 
while (left > 0) 
    int num_read = read(fd[0][0], buf + so_far, left); 
    left -= num_read; 
    so_far += num_read; 
} 
buf[so_far] = '\0'; 
printf("%s\n", buf);  
+0

ご協力いただきありがとうございます。私は自分のコードを編集しました。この問題は、wait(NULL)の後に処理を続けることができます。しかし、それは次のような出力が望まれています(子供は最初の書き込みのみを取得し、データは間違っています)。 完了! 本当にやった! –

+0

ありがとうございました。私はこの問題を解決しました。あなたのコードは完璧です。実際には、私はいくつかの愚かな間違いを犯し、プログラムが最後には実行できないようにしました。 –

+0

私はまだ少し問題があります。 bufでブレークラインを作るにはどうすればいいですか? –

0

2つのプロセスがデッドロックで捕捉され、それぞれがもう一方を待っています。 子プロセスが処理を停止したいが、親プロセスがそれ以上データを送信しないことを「認識」していないため、親プロセスを待機します。 は、子供にそれを明確にするパイプの書き込み終了を閉じるには:

write(fd[0][1], "12", 2); 
write(fd[0][1], "14", 2); 
write(fd[0][1], "15", 2); 
printf("done!\n"); 
close(fd[0][1]); 
wait(NULL); 
+0

私のコードにはすでにclose(fd [0] [1])が含まれています。しかし、私はそれを見せていませんでした。申し訳ありません..... –

0

私は、あなたがそれ故にreadへの呼び出しはブロックされます、子プロセスでFDを「書く」を閉鎖していない疑いがあります親プロセス内のブロックwaitをブロックします。

また、@ anatolygの回答に対する回答のように、質問から何かを省略した場合は、質問を編集する必要があります。私が最初に与えた答えと同じです。

+0

ありがとうございます。私はすでに子プロセスにclose fdを追加していますが、まだ解決していません。 –

+0

@EricTang - あなたは 'close(fd [1])'または '[a] [1]'(? *ファイル記述子 - 子プロセスで*あなたが読んでる前に –

+0

ああ、申し訳ありませんが、私はそれを逃しました。 –

関連する問題