Какие условия приводят к тому, что открытый, неблокирующий именованный канал (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, также возвращается пустая str ('')
  • И, конечно, если автор поставит данные в fifo, эти данные будут прочитаны.

One Solution collect form web for “Какие условия приводят к тому, что открытый, неблокирующий именованный канал (fifo) является «недоступным» для чтения?”

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

При попытке прочитать из пустой трубы или 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 
Python - лучший язык программирования в мире.