簡體   English   中英

在linux中通過命名管道發送數據塊

[英]Sending data chunks over named pipe in linux

我想通過命名管道發送數據塊,並希望接收器知道數據塊的結束位置。 我應該如何使用命名管道? 我應該使用某種格式來連接和拆分塊(將管道總是作為字節流處理)還是有其他方法?

我已嘗試在發送器處為每個數據塊打開和關閉管道,但數據在接收器端連接(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對象。

第一個選項是簡單地定義一個將通過管道運行的簡單協議。 為您發送的每個數據塊添加標題,以便您知道如何處理它。 例如,使用長度值系統:

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對象。

我只想使用JSON ecoded數據行。 這些易於調試,性能合理。

有關讀寫行的示例: http//www.tutorialspoint.com/python/file_writelines.htm

有關使用ujson(UltraJSON)的示例: https ://pypi.python.org/pypi/ujson

除了其他解決方案,您不需要堅持命名管道。 命名套接字並不差,並提供更方便的功能。 使用AF_LOCAL和SOCK_SEQPACKET,消息邊界傳輸由內核維護,因此單個send()所寫的內容將通過單個recv()獲得。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM