原文链接output=`dmesg|grephda`#becomesp1=Popen(["dmesg"],stdout=PIPE)p2=Popen(["grep","hda"],stdin=p1.stdout,stdout=PIPE)***p1.stdout.close()#Allowp1toreceiveaSIGPIPEifp2exits.***output=p2.communicate()[0]关于SIGPIPE信号,我找到这样的描述"如果你试图向一个管道或套接口写入,当读取方关闭连接,你将得到一个SIGPIPE的信号,它会使进程终止除非指定处理方法。"从大概的意思来看,关闭p1.stdout是为了让p1收到SIGPIPE信号。但是内在原因不能理解。我们建立了p1到p2的管道,为什么还要takecare他们之间的通信呢?
2 回答
喵喔喔
TA贡献1735条经验 获得超5个赞
这个信号的意义在于:你创建一个管道A|B,当B执行结束了以后,很多情况下A的继续执行是没有意义的,这时候发送一个SIGPIPE给A,默认情况下(没有对应的SigHandler)A就终止了;当然,在需要的情况下,A可以设置一个handler来处理这个信号。
智慧大石
TA贡献1946条经验 获得超3个赞
当进程P1尝试向一个管道写入数据,而管道的另一端没有进程连接时,P1将受到SIGPIPE信号。在上述例子中,当p1,p2创建完毕,管道p1.stdout和p2.stdin都连接到该管道。这时关闭p1.stdout,则只有p2.stdin从该管道读取数据。这样,当p2结束时,p1再向管道写入数据,就会收到SIGPIPE信号。换言之,如果没有p1.stdout.close(),则p1.stdout一直连接管道,p1不会收到SIGPIPE.
添加回答
举报
0/150
提交
取消