output=`dmesg | grep hda`
# becomes
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
***p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.***
output = p2.communicate()[0]
关于 SIGPIPE 信号,我找到这样的描述 "如果你试图向一个管道或套接口写入,当读取方关闭连接,你将得到一个SIGPIPE的信号,它会使进程终止除非指定处理方法。"
从大概的意思来看, 关闭 p1.stdout 是为了让 p1 收到 SIGPIPE 信号。但是内在原因不能理解。
我们建立了 p1 到 p2 的管道,为什么还要 take care 他们之间的通信呢?
这个信号的意义在于:你创建一个管道 A | B ,当B执行结束了以后,很多情况下A的继续执行是没有意义的,这时候发送一个SIGPIPE给A,默认情况下(没有对应的Sig Handler)A就终止了;当然,在需要的情况下,A可以设置一个handler来处理这个信号。