首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何非阻塞地读取命名的FIFO?

如何非阻塞地读取命名的FIFO?
EN

Stack Overflow用户
提问于 2013-01-16 03:59:07
回答 2查看 18.7K关注 0票数 20

我创建了一个先进先出,并定期从a.py以只读和非阻塞模式打开它:

代码语言:javascript
复制
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中,打开先进先出以进行写入:

代码语言:javascript
复制
out = open(fifo, 'w')
out.write('sth')

那么a.py会抛出一个错误:

代码语言:javascript
复制
buffer = os.read(io, BUFFER_SIZE)

OSError: [Errno 11] Resource temporarily unavailable

有人知道哪里出问题了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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.

因此,您得到的是没有可供读取的数据。像这样处理错误是安全的:

代码语言:javascript
复制
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

票数 17
EN

Stack Overflow用户

发布于 2013-01-16 04:07:32

代码语言:javascript
复制
out = open(fifo, 'w')

谁来帮你结账?将您的open+write替换为:

代码语言:javascript
复制
with open(fifo, 'w') as fp:
    fp.write('sth')

更新:好的,那就这样吧:

代码语言:javascript
复制
out = os.open(fifo, os.O_NONBLOCK | os.O_WRONLY)
os.write(out, 'tetet')
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14345816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档