13

Situation:

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

The read occasionally raises errno -11: Resource temporarily unavailable.

When is this error raised? It seems very rare, as the common cases return data:

  • If no writer has the pipe opened, empty str ('') is returned.
  • If the writer has the pipe opened, but no data is in the fifo, empty str ('') is also returned
  • And of course if the writer puts data in the fifo, that data will be read.
4

1 に答える 1

12

システムコールPOSIX仕様readから(強調鉱山):

空のパイプまたは FIFO から読み取ろうとする場合:

  • どのプロセスもパイプを書き込み用に開いていない場合、read() はファイルの終わりを示すために 0 を返します。

  • 一部のプロセスがパイプを書き込み用に開いていて、O_NONBLOCK が設定されている場合、read() は -1 を返し、errno を [EAGAIN] に設定します。

したがって、基本的にあなたの2番目の仮定は間違っています:

ライターがパイプを開いているが、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 に答える