Pythonを使用してUNIX(Linux、FreeBSD、MacOS X)のさまざまなフレーバーで名前付きパイプ(FIFO)を処理するときに、いくつかの奇妙なことに気づきました。最初の、そしておそらく最も厄介なのは、空/アイドルのFIFOを読み取り専用で開こうとするとブロックされることです(os.O_NONBLOCK
下位レベルのos.open()
呼び出しで使用しない限り)。ただし、読み取り/書き込み用に開くと、ブロッキングは発生しません。
例:
f = open('./myfifo', 'r') # Blocks unless data is already in the pipe
f = os.open('./myfifo', os.O_RDONLY) # ditto
# Contrast to:
f = open('./myfifo', 'w+') # does NOT block
f = os.open('./myfifo', os.O_RDWR) # ditto
f = os.open('./myfifo', os.O_RDONLY|os.O_NONBLOCK) # ditto
なぜか気になります。後続の読み取り操作ではなく、オープンコールがブロックされるのはなぜですか?
また、非ブロッキングファイル記述子がPythonでさまざまな動作を示す可能性があることにも気づきました。最初の開く操作にを使用する場合os.open()
、ファイル記述子でデータの準備ができていない場合、は空の文字列を返すようです。ただし、使用すると例外が発生します()os.O_NONBLOCK
os.read()
fcntl.fcnt(f.fileno(), fcntl.F_SETFL, fcntl.GETFL | os.O_NONBLOCK)
os.read
errno.EWOULDBLOCK
open()
私の例では設定されていない、通常によって設定されている他のフラグはありos.open()
ますか?それらはどのように異なり、なぜですか?