65

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()ますか?それらはどのように異なり、なぜですか?

4

1 に答える 1

83

それはまさにそれが定義されている方法です。open()関数の[グループを開く]ページから

O_NONBLOCK

    When opening a FIFO with O_RDONLY or O_WRONLY set: If O_NONBLOCK is
    set:

        An open() for reading only will return without delay. An open()
        for writing only will return an error if no process currently
        has the file open for reading.

    If O_NONBLOCK is clear:

        An open() for reading only will block the calling thread until a
        thread opens the file for writing. An open() for writing only
        will block the calling thread until a thread opens the file for
        reading.
于 2011-04-25T20:16:00.817 に答える