Что-то очень странное происходит, когда я открываю 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.
fsync()
по FIFO не имеет смысла; никакие данные не сохраняются на диске (кроме может быть в свопе в очень странных ситуациях). - person Ignacio Vazquez-Abrams   schedule 13.08.2011