2016-09-30 8 views
2

私はpipe()システムコール経由でプロセス間通信を行っています。子は一方の端に書き込みを行い、親は他方の端を読み込むことになっています。Linuxパイプ()の終わりが先に終了するとどうなりますか?

親が読み込みを開始する前に、waitpid()が子プロセスの完了を完了するようにします。子がゼロ以外の戻り値で終了した場合、子にエラーがあったことを示します。したがって、親は単にパイプ記述子を閉じ、読み込みせずに移動します。

子供が正常に完了した場合にこれが機能すると思いますか?パイプを読む前に、親が効果的に子どもを刈り取っていますか?はいの場合、転送中のデータはどうなりますか? OSは安全に親エンドに到達するデータを処理しますか?

答えて

2

親プロセスがパイプを開きます。 PDT内の2つのポインタがパイプを指し示します。 1つは書面に、もう1つは読書に。

forkを使用して子プロセスが作成されるたびに、PDTが複製されます。したがって、子プロセスはPIPEを指し示すPDT内に独自のポインタを持つことになります。

最初はパイプが空ですが、親プロセスが読み取りを試みるとブロックされます。 子プロセスを作成することはありません。これはデッドロックに終わるでしょう。

読み込み前に書き込み終了を閉じると、デッドロックは発生しませんが、子プロセスはパイプに書き込むことができなくなります(上記の理由を参照)。

これはあなたの流れのようになります。

1. Parent process creates pipe 
2. fork() 
3. in parent process you close the writing end 
4. in child process you close the reading end 
5. read/write to pipe. 
関連する問題