python子进程模块的17.1.4.2: Replacing shell pipeline节说要替换
output=`dmesg | grep hda`
与
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]
对第三行的评论解释了为什么调用close函数,而不是为什么它有意义。对我来说,它没有。在调用通信方法之前,是否会关闭p1.stdout以阻止通过管道发送任何输出? (显然它不会,我试图运行代码,它运行正常)。 为什么是否需要调用close来使p1接收SIGPIPE?什么样的亲密关闭?究竟是什么关闭?
请认为这是一个学术问题,除了更好地理解这些事情之外,我不是要做任何事情。
答案 0 :(得分:10)
您正在父进程中关闭p1.stdout
,因此将dmesg作为打开该文件描述符的唯一进程。如果你没有这样做,即使dmesg关闭它的标准输出,你仍然会打开它,并且不会生成SIGPIPE
。 (操作系统基本上保持引用计数,并在它达到零时生成SIGPIPE
。如果不关闭文件,则可以防止它达到零。)