【问题标题】:What conditions result in an opened, nonblocking named pipe (fifo) being "unavailable" for reads?什么情况会导致打开的、非阻塞的命名管道 (fifo) 对读取“不可用”?
【发布时间】:2012-04-18 18:56:19
【问题描述】:

情况:

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:资源暂时不可用。

什么时候出现这个错误?这似乎非常罕见,因为常见情况会返回数据:

  • 如果没有写入器打开管道,则返回空 str ('')。
  • 如果写入器打开了管道,但 fifo 中没有数据,则为空 str ('') 也返回
  • 当然,如果写入器将数据放入 fifo,则会读取该数据。

【问题讨论】:

  • @agf:另一个问题是关于 sendto 错误,这是因为发送缓冲区已满。与这个特定问题的联系充其量是值得怀疑的,因为我们在这里谈论的是阅读 Unix 管道
  • @NiklasB。问题当然不相似,但答案是相似的。投票以重复关闭只是链接到另一个问题的便捷方式。并将其链接到侧边栏的顶部。

标签: python linux named-pipes fifo mkfifo


【解决方案1】:

来自POSIX specification of the read system call(强调我的):

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

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

  • 如果某个进程打开了用于写入的管道并且设置了 O_NONBLOCK, 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

【讨论】:

  • 非常感谢。看来我自己的测试代码确实有错误!
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 2011-09-23
  • 2016-08-09
相关资源
最近更新 更多