os.write() 上出现意外的 BrokenPipe 错误

问题描述 投票:0回答:0

我正在为一个学校项目编写一个 rsync 的迷你版本,我快完成了,但是在尝试写入我的服务器端管道时出现意外的 brokenpipe 错误。

这里是主程序,mrsync.py:

#!
import os, sys, options, filelist, message,generator, select, time, signal
cread,swrite=os.pipe() #serv->client
sread,cwrite=os.pipe() #client -> serv
print(f"cread:{cread},swrite{swrite},sread:{sread},cwrite:{cwrite}",file=sys.stderr)
os.set_inheritable(cread,True)
os.set_inheritable(cwrite,True)
os.set_inheritable(sread,True)
os.set_inheritable(swrite,True)
[...]
                (_,w1,_)=select.select([],[swrite],[],to)
                for write in w1:
                    print("!!!!!!!!!!!!!!!!!!!!! IN SWRITE !!!!!!!!!!!!!!!!!!!!!",file=sys.stderr)
                    if filestocopy !=[]:
                        print("!!!!!!!!!!!!!!!!!!!!! SERV WRITE !!!!!!!!!!!!!!!!!!!!!",file=sys.stderr)
                        message.send(write,filestocopy)
                        os.close(write)
                sys.exit(0)
    [...]
        print("!!!!!!!!!!!!!!!!!!!!!!!!! CLIENT READ !!!!!!!!!!!!!!!!!!!!",file=sys.stderr)
        os.close(swrite)
        a=message.receive(read)
        filestosend+=a
        print(f"!!!!!!!!!! FILESTOSEND RECEIVED: {filestosend}",file=sys.stderr)
        filestocopyreceived=1
        os.close(read)
    [...]

这里是message.py:

import os,sys, pickle

def send(fd,v,tag=None):
    print(f"!!!SENDING {v} to :{fd}\n",file=sys.stderr)
    v=memoryview(pickle.dumps(v))
    size=v.__sizeof__()
    
   
    #envoi du message
    print(f"!!!!!!SIZE:{size}\n",file=sys.stderr)
    while v:
        sent = os.write(fd,v)
        print(f"!!!SENT:{v} to:{fd}\n",file=sys.stderr)
        v = v[sent:]
        
def receive(fd):
    print(f"!!!RECEIVING from :{fd}\n",file=sys.stderr)
    buffersize = 4096
    msg=b''
    while True:
        buffer = os.read(fd, buffersize)
        if not buffer:
            break
        print(f"buffer:{buffer}\n",file=sys.stderr)
        msg += buffer
    try:
        msg = pickle.loads(msg)
    except:
        msg='Message vide'
    print(f"!!!FINAL msg received :{msg}\n",file=sys.stderr)
    return msg

这是执行后的错误信息

Traceback (most recent call last):
  File "/Coding/Projet_Systeme/mrsync.py", line 48, in <module>
    message.send(write,filestocopy)
  File "/Coding/Projet_Systeme/message.py", line 12, in send
    sent = os.write(fd,v)
BrokenPipeError: [Errno 32] Broken pipe

我在我的代码中看不到任何可能关闭 swrite 的地方,所以我真的不知道为什么会这样。

python pipe broken-pipe
© www.soinside.com 2019 - 2024. All rights reserved.