subprocess.Popen文档 示例代码意义求解惑

原文链接
output=`dmesg|grephda`
#becomes
p1=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他们之间的通信呢?
手掌心
浏览 290回答 2
2回答

喵喔喔

这个信号的意义在于:你创建一个管道A|B,当B执行结束了以后,很多情况下A的继续执行是没有意义的,这时候发送一个SIGPIPE给A,默认情况下(没有对应的SigHandler)A就终止了;当然,在需要的情况下,A可以设置一个handler来处理这个信号。

智慧大石

当进程P1尝试向一个管道写入数据,而管道的另一端没有进程连接时,P1将受到SIGPIPE信号。在上述例子中,当p1,p2创建完毕,管道p1.stdout和p2.stdin都连接到该管道。这时关闭p1.stdout,则只有p2.stdin从该管道读取数据。这样,当p2结束时,p1再向管道写入数据,就会收到SIGPIPE信号。换言之,如果没有p1.stdout.close(),则p1.stdout一直连接管道,p1不会收到SIGPIPE.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript