如何用Python正确地编写FIFOs?

2024-09-28 21:56:06 发布

您现在位置:Python中文网/ 问答频道 /正文

当我在Python中打开FIFOs(命名管道)进行编写时,发生了一些非常奇怪的事情。考虑一下当我试图打开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'

有人经历过吗?如果是的话,有没有解决办法?我现在的操作系统是Ubuntu11.04和Linux2.6.38。


Tags: 数据readdata键入管道os情况some
2条回答

要避免刷新,请在不缓冲的情况下打开文件:

fifo_read = open('fifo', 'r', 0)

这将消除高级缓冲。数据直接进入操作系统,作为一个fifo,它们永远不会真正写入磁盘,而是通过fifo缓冲区直接传递给读卡器,所以不需要同步。

当然,正如您在注释中指出的那样,您应该首先在shell中使用os.mkfifo()mkfifo创建fifo。

在到达EOF之前,read()不会返回。

您可以尝试指定要读取的字节数,例如read(4)。在写入足够的字节之前,这仍然会阻塞,因此生产者必须至少写入那么多字节,然后调用flush()

相关问题 更多 >