python – 在linux中通过命名管道发送数据块

我想通过命名管道发送数据块,并希望接收器知道数据块的结束位置.我应该如何使用命名管道?我应该使用某种格式来连接和拆分块(将管道总是作为字节流处理)还是有其他方法?

我已尝试在发送器处为每个数据块打开和关闭管道,但数据在接收器端连接(EOF不发送):

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

结果:

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

解决方法:

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

第一个选项是简单地定义一个将通过管道运行的简单协议.为您发送的每个数据块添加标题,以便您知道如何处理它.例如,使用长度值系统:

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))

至于另一个选项 – 您可以尝试读取多处理模块的代码,但实际上,您只需通过管道运行cPickle.dumps的结果,然后将其读入cPickle.loads以获取Python对象.

上一篇:linux – 关闭不需要的文件描述符


下一篇:LINUX进程间通信:PIPE与FIFO