Подтвердить что ты не робот

Какие условия приводят к тому, что открытый, неблокирующий именованный канал (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: ресурс временно недоступен.

Когда возникает эта ошибка? Это кажется очень редким, поскольку обычные случаи возвращают данные:

  • Если ни один писатель не открыл трубку, возвращается пустая строка str ('').
  • Если у писателя открыт канал, но нет данных в fifo, пустая строка ('') также возвращается
  • И, конечно, если автор помещает данные в fifo, эти данные будут прочитаны.
4b9b3361

Ответ 1

Из спецификация POSIX системного вызова read (выделение мое):

При попытке чтения из пустого канала или FIFO:

  • Если ни один процесс не имеет открытого канала для записи, read() должен возвращать 0 в укажите конец файла.

  • Если какой-либо процесс имеет открытый канал для записи и установлен O_NONBLOCK, read() возвращает -1 и устанавливает errno в [EAGAIN].

Итак, в основном ваше второе предположение неверно:

Если у писателя открыт канал, но нет данных в fifo, также возвращается пустая строка ('')

Это будет противоречить спецификации, и я не могу воспроизвести это поведение на моей машине (для меня это поднимает 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