如何在Python中正确写入FIFO?
当我在Python中打开FIFO(命名管道)进行写入时,发生了非常奇怪的事情。考虑一下当我尝试打开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'
有人经历过吗?如果是这样,是否有解决方法?我当前的操作系统是带有Linux 2.6.38的Ubuntu 11.04。
回答:
read()
直到达到EOF才返回。
您可以尝试指定要读取的字节数,例如read(4)
。在写入足够的字节之前,它仍然会阻塞,因此生产者必须至少写入那么多字节,然后调用flush()
。
以上是 如何在Python中正确写入FIFO? 的全部内容, 来源链接: utcz.com/qa/425995.html