从Python子进程模块解释示例管道

Lau*_*low 7 python subprocess

17.1.4.2:替换 python子进程模块的shell管道表示要替换

output=`dmesg | grep hda`
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

对第三行的评论解释了为什么调用close函数,而不是为什么它有意义.对我来说,它没有.调用通信方法之前是否会关闭p1.stdout以防止通过管道发送任何输出?(显然它不会,我试图运行代码,它运行正常).为什么有必要调用close来使p1接收SIGPIPE?什么样的亲密关闭?究竟是什么关闭?

请考虑这是一个学术问题,除了更好地理解这些事情之外我不想做任何事情.

and*_*ski 10

您正在关闭p1.stdout进程,从而留下的dmesg作为与文件描述符只开放进程.如果你没有这样做,即使dmesg关闭它的标准输出,你仍然会打开它,并且SIGPIPE不会生成.(操作系统基本上保持引用计数,并SIGPIPE在它达到零时生成.如果不关闭文件,则可以防止它达到零.)