13

情况:

new_pipe = os.open(pipe_path, os.O_RDONLY | os.O_NONBLOCK) # pipe_path points to a FIFO
data = os.read(new_pipe, 1024)

读取偶尔会引发 errno -11:资源暂时不可用。

何时引发此错误?这似乎非常罕见,因为常见情况会返回数据:

  • 如果没有 writer 打开管道,则返回空 str ('')。
  • 如果 writer 已打开管道,但 fifo 中没有数据,则还返回空 str ('')
  • 当然,如果作者将数据放入先进先出,该数据将被读取。
4

1 回答 1

12

系统调用的POSIX 规范read(强调我的):

尝试从空管道或 FIFO 中读取时:

  • 如果没有进程打开管道进行写入,read() 将返回 0 以指示文件结束。

  • 如果某个进程打开管道进行写入并且设置了 O_NONBLOCK,则 read() 应返回 -1 并将 errno 设置为 [EAGAIN]。

所以基本上你的第二个假设是错误的:

如果 writer 已打开管道,但 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
于 2012-04-05T02:36:28.650 回答