2017-03-21 2 views
0

親がパイプからread()でブロックされているときに子プロセスが強制終了されるとどうなりますか?親プロセスでこのシナリオをどのように処理する必要がありますか?親が読み取り時にブロックされている間に子プロセスが終了しました

説明のため、親プロセスには2つのスレッドがあります。 thread2が子を殺したときに、thread1がパイプから読み込んでいたとします。

read()は-1を返しますか?

ここで助けていただければ幸いです。

+0

回答を受け取る機会を増やすためにコードを共有することをお勧めします。 [最小限で完全で検証可能なサンプルの作成方法](https://stackoverflow.com/help/mcve) – Arash

+0

パイプのマニュアルページをチェックしてください:http://man7.org/linux/man-pages/man7 /pipe.7。html – TonyB

+0

あなたのシナリオをテストするには少なくとも努力するべきです。このプロセスでは、それがどのように動作するかを学習します。次に、見える動作が一貫しているかどうかを尋ねることができます。 – alvits

答えて

2

パイプの動作はプロセスの関係とは関係ありません。読者が親、子、兄弟、または他の何らかの遠隔の関係者であるかどうかにかかわらず、同じ規則が適用されます。あるいは、リーダーとライターが同じプロセスであっても。

短い答えは、書き込み処理の死は、ビューの読者の視点からだけでEOF、エラーではありません、これは書き込み処理が自発的に_exit()と呼ばれるか、シグナルによって殺されたかどうかに依存しないことです。

全体の因果連鎖はこのように書きます:

  1. プロセスXは死ぬ - >プロセスXのファイル記述子のすべてが閉じられています。プロセスXのファイルディスクリプタの

  2. つのパイプライト・ファイル記述子がクローズされ

  3. パイプの書き込み終わりだった - >それは最後のものでしたか?

3aである。同じパイプ上に他の書き込みファイル記述子があります(例えば、forkによって継承され、別のプロセスでまだ開いています)、何も起こりません。やめる。

3b。このパイプのファイル記述子を書くことはもうありません - >パイプがEOFをヒットしました。

  1. パイプヒットEOF - >読者に通知。

4a。パイプの読み込みファイル記述子はすべて読み取り可能になり、selectまたはpollまたはreadまたは別の同様のシステムコールでブロックしていたプロセスをすべて起動させます。

4b。パイプバッファ内に残ったデータがある場合(最後の書き込みファイル記述子が閉じられる前に書き込まれる)、そのデータはリーダーに返されます。

4c。パイプバッファが空になるまで4bを繰り返す。

4d。最後に、read()は0を返し、EOFを示します。

子プロセスの終了ステータスは、waitファミリのsyscallsファミリによって親プロセスに返されます。子プロセスが信号によっていつ殺されたかを知りたい場合は、チェックする必要があります。

関連する問題