How to read named FIFO non-blockingly?

喜欢而已 提交于 2019-12-04 08:34:10

问题


I create a FIFO, and periodically open it in read-only and non-blockingly mode from 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)

From b.py, open the fifo for writing:

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

Then a.py will raise an error:

buffer = os.read(io, BUFFER_SIZE)

OSError: [Errno 11] Resource temporarily unavailable

Anyone know what's wrong?


回答1:


According to the manpage of 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.

So what you're getting is that there is no data available for reading. It is safe to handle the error like this:

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

Make sure you have the errno module imported: import errno.




回答2:


out = open(fifo, 'w')

Who will close it for you? Replace your open+write by this:

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

UPD: Ok, than just make this:

out = os.open(fifo, os.O_NONBLOCK | os.O_WRONLY)
os.write(out, 'tetet')


来源:https://stackoverflow.com/questions/14345816/how-to-read-named-fifo-non-blockingly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!