20

FIFO を作成し、a.py から読み取り専用および非ブロッキング モードで定期的に開きます。

os.mkfifo(cs_cmd_fifo_file, 0777)
io = os.open(fifo, os.O_RDONLY | os.O_NONBLOCK)
buffer = os.read(io, BUFFER_SIZE)

b.py から、書き込むために fifo を開きます。

out = open(fifo, 'w')
out.write('sth')

次に、 a.py でエラーが発生します。

buffer = os.read(io, BUFFER_SIZE)

OSError: [Errno 11] Resource temporarily unavailable

誰が何が悪いのか知っていますか?

4

2 に答える 2

17

のマンページによるとread(2)

   EAGAIN or EWOULDBLOCK
          The  file  descriptor  fd refers to a socket and has been marked
          nonblocking   (O_NONBLOCK),   and   the   read   would    block.
          POSIX.1-2001  allows  either error to be returned for this case,
          and does not require these constants to have the same value,  so
          a portable application should check for both possibilities.

つまり、取得できるのは、読み取ることができるデータがないということです。次のようにエラーを処理しても安全です。

try:
    buffer = os.read(io, BUFFER_SIZE)
except OSError as err:
    if err.errno == errno.EAGAIN or err.errno == errno.EWOULDBLOCK:
        buffer = None
    else:
        raise  # something else has happened -- better reraise

if buffer is None: 
    # nothing was received -- do something else
else:
    # buffer contains some received data -- do something with it

errnoモジュールがインポートされていることを確認してくださいimport errno

于 2013-01-15T20:02:42.250 に答える
-2
out = open(fifo, 'w')

誰があなたのためにそれを閉じますか? open+write を次のように置き換えます。

with open(fifo, 'w') as fp:
    fp.write('sth')

UPD: わかりました、これを作るだけではありません:

out = os.open(fifo, os.O_NONBLOCK | os.O_WRONLY)
os.write(out, 'tetet')
于 2013-01-15T20:07:31.893 に答える