2009-03-23 19 views
8

私は開いているos.pipe()から、読んでいる瞬間にそれが空であるかどうかを調べようとしています。問題は、read()を呼び出すと、実際に何かがそこに読み込まれるまでプログラムがブロックされてしまいますが、テストが成功すれば何もありません。ブロックされずにos.pipe()から読み取る方法は?

私はselect.select()をタイムアウトに使用することができますが、問題の別の解決策があるかどうかを知りたいと思っていました。

答えて

14

これは試してみることもできます。

import os, fcntl 
fcntl.fcntl(thePipe, fcntl.F_SETFL, os.O_NONBLOCK) 

この場合、thePipe.read()はノンブロッキングである必要があります。 pipe(7)マニュアルページから

プロセスは、データが利用可能になるまで、(2) をブロックする読み取る次いで、 空のパイプから読み取ろうとした場合。 (...) fcntl(2)F_SETFLの操作を にすると、ファイルのオープン状態 をO_NONBLOCKにすることで、非ブロックI/Oが可能になります。

+1

ありがとうございました。これはまさに私が必要としていたものです。 – mpeterson

+1

Yesssss!ありがとうございました! – juliomalegria

+0

注意: '.readline()'のようなファイルメソッドは、非ブロックモードを期待していないかもしれません。 – jfs

関連する問題