2012-01-26 6 views
2

パイプを介して通信する2つのプロセス(親と子)があります。親は子が終了するのを待っていて、次にパイプの読み込み側からデータを読み込みます。子供は非常に多くの出力を生み出すことがあります。あまりにも多くの未読データがあるためにパイプが失敗し、子供の出力の一部が失われる可能性はありますか?パイプがオーバーフローする心配はありますか?

+0

このような理由はありますか?プロセスが一度に一方向にしか通信しない場合は、パイプを使用する必要はありません。なぜ親がランダムなファイル名を生成して、そのファイルに子を書き込ませるのではないでしょうか? – frankc

答えて

3

標準の2.6または3.0カーネルでは、パイプバッファーは64kです。バッファーがいっぱいになると、最初のプロセスは書き込み時にブロックされます。

一方で、これは少なすぎる場合には、構成可能なメモリサイズが2人の労働者の間にbufferを、使用

+3

バッファーがいっぱいになると2番目のプロセスが終了せず、2番目のプロセスが終了するまでバッファーから何も読み取られないため、これを心配しなくてはなりません。それはデッドロックです! –

+0

私の編集を参照してください:あなたのバッファサイズを調整するのに 'buffer'を使用してください。 –

+0

パイプがいっぱいであれば書き込みプロセスがブロックされますが、Linuxバージョンもパイプバッファーのサイズもその動作に影響しません。 –

1

はい、パイプが子プロセスのブロックをいっぱいにして、デッドロックを取得する場合。

これはPythonでも発生する問題です。Popen.wait()の[1]のセクション17.1.2の警告を参照してください。彼らは問題を回避するために通信方法を使用しました。

[1] http://docs.python.org/library/subprocess.html

関連する問題