什么条件导致一个打开的,无阻塞的命名pipe道(fifo)不可读取?

情况:

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

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

  • 如果没有编写者打开pipe道,则返回空str('')。
  • 如果作者打开了pipe道,但没有数据在FIFO中,则返回空str('')
  • 当然,如果作者将数据放在fifo中,那么这些数据将被读取。

read系统调用的POSIX规范 (重点是我的):

当试图从一个空的管道或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