當我在Python中打開FIFO(命名管道)進行寫入時,發生了一些非常奇怪的事情。考慮會發生什麼,當我試圖打開一個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()
,那麼數據就會被刷新。如果我使用一個shell命令喂管:
$ echo "some data" > fifo
然後將讀卡器輸出是:
>>> fifo_read.read()
'some data\n'
有沒有人遇到過這個?如果是的話,是否有解決方法?我目前的操作系統是Ubuntu 11.04和Linux 2.6.38。
你是如何創建fifo的? – OneOfOne
在FIFO上使用「os.mkfifo('fifo')」或shell「mkfifo fifo」 –
'fsync()'是沒有意義的;沒有數據存儲在光盤上(除非在非常奇怪的情況下*可能*在交換中)。 –