当前位置: 首页 > 面试题库 >

如何在Python中正确写入FIFO?

杜炫明
2023-03-14
问题内容

当我在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)。在写入足够的字节之前,它仍然会阻塞,因此生产者必须至少写入那么多字节,然后html" target="_blank">调用flush()



 类似资料:
  • 我存储用户收藏夹到json文件,但我得到以下错误: 未处理的异常:类型“\u InternalLinkedHashMap” 我将以下数据添加到文件中: 代码是: 我很困惑,不知道如何解决这个问题。

  • 听起来有点愚蠢,但我需要我的方法的帮助,这很烦人。我试着在网上查找,因为是一个出错和“找不到Kid constructor#2”的程序,尽管它在那里,我甚至会做其他事情,但它不起作用。好吧,这太多了,下面是我的代码: 好的,所以我上面的toString(我知道,我的第三个参数是关闭的,应该是字符串)是关闭的。如果我硬编码第三个值,它就会失控,说它找不到这个(上面)。那么我怎么才能得到日期并把它分开

  • 问题内容: 我面临该功能的奇怪行为: 此代码打印: 我希望浮动值总是四舍五入,但是取整到最接近的偶数。 为什么会出现这种行为?获得正确结果的最佳方法是什么? 我尝试使用,但结果是相同的。 问题答案: “ 数字类型” 部分明确记录了此行为: x 四舍五入为n位数字,四舍五入为偶数。如果省略n,则默认为0。 注意 四舍五入到一半 。这也被称为 银行家四舍五入 ; 通过四舍五入到最接近的 偶数, 您可以

  • 问题内容: 如何设置模块导入,以便每个模块都可以访问其他所有模块的对象? 我有一个中等大小的Python应用程序,在各个子目录中都有模块文件。我使用创建了将这些子目录附加到模块并导入一组模块的模块。使用该限定条件引用模块对象。然后,我使用将该模块导入其他模块。现在的代码草率,其中有几处通常是重复的。 首先,应用程序失败,因为未分配某些模块引用。单元测试时,会运行相同的代码。 其次,我担心递归模块导

  • 我正在尝试导入一个jar文件。我的文件“test.java”包含一行: 注意:我使用的是Mac电脑。

  • 问题内容: 我想重写我的Python类和方法。我的用例是通常的用例:我有一些要处理的特殊名称,并且我希望其他任何行为都具有默认行为。因为,似乎我可以通过提高请求默认行为。但是,我怎样才能做到这一点呢?这是一个简单的示例,使用不可变字段“A”,“ B”和“ C”实现一个类。 用什么代替问号?对于老式类,答案显然是,但是文档表明这对于新型类是错误的。 问题答案: 它的 在Python 2中,或 在Py