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
誰が何が悪いのか知っていますか?
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
。