2013-12-21 4 views
2

명명 된 파이프를 통해 데이터 블록을 보내고 수신기가 데이터 블록의 끝을 알기를 원합니다. 명명 된 파이프로 어떻게해야합니까? 블록 결합 및 분할 (파이프를 항상 바이트 스트림으로 처리)에 사용하거나 다른 방법이 있습니까?리눅스에서 명명 된 파이프를 통해 데이터 청크 보내기

I는 각 데이터 블록에 대한 발신자의 개폐 파이프 시도했지만 데이터가 수신 측에서 연접된다 (EOF 보내지)

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

결과 :

[email protected] temp $ cat myfifo 
[email protected] temp $ 

답변

3

할 수 어느 어떤 종류의 구분자 (delimiter) 나 파이프 구조를 사용하거나, (바람직하게는) 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으로 읽어주십시오.

1

, 당신은 이름에 충실 할 필요가 없습니다 파이프. 명명 된 소켓은 더 나쁘지 않고보다 편리한 기능을 제공합니다. AF_LOCAL 및 SOCK_SEQPACKET을 사용하면 메시지 경계 전송이 커널에 의해 유지되므로 단일 send()로 작성된 내용은 단일 recv()로 반대쪽에 있습니다.

관련 문제