python - 在 Linux 中通过命名管道发送数据 block

标签 python linux file fifo

我想通过命名管道发送数据 block ,并希望接收方知道数据 block 在哪里结束。我应该如何使用命名管道呢?我应该使用某种格式来连接和拆分块(始终将管道视为字节流)还是有任何其他方法?

我已经尝试在每个数据 block 的发送端打开和关闭管道,但数据在接收端连接起来(EOF 未发送):

for _ in range(2):
     with open('myfifo', 'bw') as f:
         f.write(b'+')

结果:

rsk@fe temp $ cat myfifo 
++rsk@fe temp $

最佳答案

您可以在管道上使用某种分隔符或框架结构,或者(最好)像对象一样使用 multiprocessing.Pipe 并通过它们运行 Pickled Python 对象。

第一个选项只是定义一个简单的协议(protocol),您将在您的管道中运行该协议(protocol)。为您发送的每个数据 block 添加一个 header ,以便您知道如何处理它。例如,使用长度值系统:

import struct

def send_data(file_descriptor, data):
    length = struct.pack('>L', len(data))
    packet = "%s%s" % (length, data)
    file_descriptor.write(packet)

def read_data(file_descriptor):
    binary_length = file_descriptor.read(4)
    length = struct.unpack('>L', binary_length)[0]

    data = ''
    while len(data) < length:
        data += file_descriptor.read(length - len(data))

至于其他选项 - 您可以尝试阅读 multiprocessing 模块的代码,但本质上,您只是通过管道运行 cPickle.dumps 的结果,并且然后将其读入 cPickle.loads 以获取 Python 对象。

关于python - 在 Linux 中通过命名管道发送数据 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20719819/

相关文章:

c - 使用 uint64_t 作为键和结构作为值的 GHashTable

c - 将文件输入存储到 C 中的结构中

python - 无法使用Python多处理进行大量计算

python - Pandas :从一列中为另一列中的每个唯一值获取最高值

python - 属性错误: 'Config' object has no attribute 'test_system'

python - 如何在Python中深度复制队列

mysql - 在 bash 脚本中自动安装 mysql-server 后无法连接到 mysql

linux - 如何将输出附加到文件中?

linux - Linux,如何使用Shell脚本进行文件操作?

c - 无法从 C 文本文件中读取结构