2016-03-19 6 views
-1
// Some initialization 

// Child process 
// stdin is redirected to fd[0] 
while (fgets(someCharArray, sizeof(someCharArray), stdin) { 
    printf("%s\n", someCharArray); 
} 

// Parent process 
char greeting[50] = "hello\n\0"; 
write(fd[1], greeting, sizeof(greeting)); 
close(fd[1]); 

私はこれらのパイプに本当にうんざりしています。 fgetsは、改行まで読み込む必要があります。これは "hello"を読み込んで正常に印刷します。しかし、プロセスは終了しません。私は親のパイプの書き込み終了を閉じました。したがって、0またはEOFを返し、whileループを終了する必要があります。パイプを使用しているwhile(read)ループが終了しないのはなぜですか?

改行文字とヌルターミネータの有無にかかわらず、「h​​ello」のさまざまな組み合わせを試しました。私は本当に問題が何かを見ていない。

+1

後に子プロセスでfd[1]を閉じる必要がありますあなたの場合は [1]? – jdarthenay

+0

[完全で検証可能な最小限の例]を表示してください(http://stackoverflow.com/help/mcve)。おそらくあなたはすべての右のfdを閉じるわけではありません。だから完全なコードを見る必要があります。 – kaylum

+0

@jdarthenay私はこれについて不明です。子プロセスは実際に別のソースファイルを実行しました。したがって、 'fd'はありません。私はwhileループの前に 'stdout'を' close 'しようとしましたが、それは意味をなさないでしょう。これは、メインプログラムの 'fd'を子供に渡す必要があることを意味しますか? – ludluck

答えて

0

fd[0]EOFになるようにするには、それらを知っているすべてのプロセスでfd[1]を閉じておく必要があります。子プロセスでは、あなたがあなたがまた `close` FD右fork()

if (fork() == 0) 
{ 
    close(fd[1]); 
    // ... 
    // instructions for child process 
    exit 0; 
} 
関連する問題