を作成し、次に を作成するpipe
としますfork
。親ではclose
、書き込み側とfdopen
読み取り側で を取得しFILE*
ます。子では、あなたclose
stdout
、パイプの両端を 、パイプの両端、およびにdup2
書き込みます。d 子の動作や親で行われた他の呼び出しなど、どのような条件下で、子が消費後に終了したときに親に表示されるか、ハングなどの呼び出しが発生しますか?stdout
close
exec
exec
eof
FILE*
stdout
getline
3 に答える
標準 I/O ライブラリは内部read(2)
で andwrite(2)
を使用します。の動作はread(2)
、パイプ内に使用可能なデータがなく、アクティブなライターがない場合、EOF を示すために 0 を返すことです (標準 I/O ライブラリは、これを、私たちが知っている負の EOF 定数に変換します)。
したがって、適切に設定するgetline()
と、ハングせず、-1 が返されます。
子プロセスが終了してパイプを閉じたときにもハングする場合getline()
は、パイプの書き込みチャネルを別の場所で開いたままにしている可能性があります。を呼び出す前に、親が書き込みチャネルを閉じていることを再確認してくださいgetline()
。
パイプを正しく設定した場合 (そして、設定したように思えます)、親には実際に EOF が表示されるはずです。関連する問題は、親も子供の世話をwait
しなければならないということです。そうしないと、子供はゾンビのままになります。
何らかの理由でプロセスが終了すると、オペレーティング システムは残りの開いているファイル記述子をすべて閉じます。
パイプ、ファイル、およびソケットの保留中のデータは、OS によって最初に書き込まれ、送信されます。もう一方のピアは、保留中のデータに続いて を受信しますEOF
。「適切な設定」は必要ありません。