我创建了一个先进先出,并定期从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中,打开先进先出以进行写入:
out = open(fifo, 'w')
out.write('sth')
那么a.py会抛出一个错误:
buffer = os.read(io, BUFFER_SIZE)
OSError: [Errno 11] Resource temporarily unavailable
有人知道哪里出问题了吗?
发布于 2013-01-16 04:02:42
根据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-16 04:07:32
out = open(fifo, 'w')
谁来帮你结账?将您的open+write替换为:
with open(fifo, 'w') as fp:
fp.write('sth')
更新:好的,那就这样吧:
out = os.open(fifo, os.O_NONBLOCK | os.O_WRONLY)
os.write(out, 'tetet')
https://stackoverflow.com/questions/14345816
复制相似问题