情况:
new_pipe = os.open(pipe_path, os.O_RDONLY | os.O_NONBLOCK) # pipe_path points to a FIFO
data = os.read(new_pipe, 1024)
读取偶尔会引发错误号-11:资源暂时不可用。
何时出现此错误?这似乎非常罕见,因为常见情况会返回数据:
- 如果没有写入程序打开管道,则返回空的str(")
- 如果写入程序打开了管道,但fifo中没有数据,则为空str('')也会返回
- 当然,如果作者将数据放入fifo,数据就会被读取
来自read
系统调用(emphasis mine)的POSIX规范:
当尝试从空管道或FIFO读取时:
如果没有进程打开管道进行写入,则read()将返回0指示文件结束。
如果某个进程打开了管道进行写入,并且设置了O_,read()应返回-1并将errno设置为[EAGAIN]
所以基本上你的第二个假设是错误的:
如果写入程序打开了管道,但fifo中没有数据,则还会返回空的str('')
这将违反规范,我无法在我的机器上重现这种行为(它为我引发了EAGAIN
)。不过,这不是什么大问题,您可以捕获异常并重试:
import errno
def safe_read(fd, size=1024):
''' reads data from a pipe and returns `None` on EAGAIN '''
try:
return os.read(fd, size)
except OSError, exc:
if exc.errno == errno.EAGAIN:
return None
raise