Как правильно писать в FIFO в Python?

Что-то очень странное происходит, когда я открываю FIFO (именованные каналы) в Python для записи. Подумайте, что происходит, когда я пытаюсь открыть FIFO для записи в интерактивном интерпретаторе:

>>> fifo_write = open('fifo', 'w')

Вышеупомянутая строка блокируется, пока я не открою другой интерпретатор и не наберу следующее:

>>> fifo_read = open('fifo', 'r')
>>> fifo.read()

Я не понимаю, почему мне пришлось ждать конвейера будет открыт для чтения, но давайте пропустим это. Приведенный выше код будет блокироваться до тех пор, пока не появятся ожидаемые данные. Однако, допустим, я возвращаюсь к первому окну интерпретатора и набираю:

>>> fifo_write.write("some testing data\n")
>>> fifo_write.flush()

Ожидаемое поведение состоит в том, что во втором интерпретаторе будет возвращен вызов read , и мы увидим данные на экране, за исключением того, что со мной не происходит. Если я позвоню os.fsync , произойдет следующее:

>>> import os
>>> fifo_write.flush()
>>> os.fsync(fifo_write.fileno())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument

И считыватель fifo все еще ждет. Однако, если я вызываю fifo_writer.close () , данные удаляются. Если я использую команду оболочки для подачи канала:

$ echo "some data" > fifo

, то вывод читателя будет:

>>> fifo_read.read()
'some data\n'

Кто-нибудь испытал это? Если да, то есть ли обходной путь? Моя текущая ОС - Ubuntu 11.04 с Linux 2.6.38.

17
задан tshepang 3 February 2014 в 10:59
поделиться