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_NONBLOCKos.read()fcntl.fcnt(f.fileno(), fcntl.F_SETFL, fcntl.GETFL | os.O_NONBLOCK)os.readerrno.EWOULDBLOCK
open()私の例では設定されていない、通常によって設定されている他のフラグはありos.open()ますか?それらはどのように異なり、なぜですか?