Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确地用Python编写FIFO?_Python_Linux_Fifo_Mkfifo - Fatal编程技术网

如何正确地用Python编写FIFO?

如何正确地用Python编写FIFO?,python,linux,fifo,mkfifo,Python,Linux,Fifo,Mkfifo,当我用Python打开FIFO(命名管道)进行编写时,发生了一些非常奇怪的事情。考虑一下,当我试图打开一个FIFO写一个交互式解释器: >>> fifo_write = open('fifo', 'w') 在打开另一个解释器并键入以下内容之前,上述行将一直阻塞: >>> fifo_read = open('fifo', 'r') >>> fifo.read() 我不明白为什么我必须等待管道打开阅读,但让我们跳过这一步。上面的代码将被阻塞,

当我用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_read.read()
'some data\n'
有人经历过吗?如果有,是否有解决办法?我目前使用的操作系统是Ubuntu11.04和Linux 2.6.38。

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


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

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

fifo_read = open('fifo', 'r', 0)
这将删除高级缓冲。数据直接进入操作系统,作为一个fifo,它们永远不会真正写入磁盘,而是通过fifo缓冲区直接传递给读卡器,因此不需要同步


当然,正如您在评论中所指出的,您应该首先在shell中使用
os.mkfifo()
mkfifo
创建fifo。

在fifo上使用“os.mkfifo('fifo')”或在shell中使用“mkfifo fifo”
fsync()
,没有任何意义;没有任何数据存储在光盘上(除了在非常奇怪的情况下可能在交换中)。为此,在“读取”方法中添加一个参数解决了问题,但仍然需要刷新。@thiadearruda确切的参数是什么?@n611x007:我假设要读取的字节数与示例中相同。这是
read()。
fifo_read = open('fifo', 'r', 0)