我正在阅读子流程模块部分中有关 Popen 类的 Python 文档,我遇到了以下代码:
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)
该文件还指出
“启动 p2 后的 p1.stdout.close() 调用很重要,如果 p2 在 p1 之前退出,p1 会收到 SIGPIPE。
为什么必须在我们接收 SIGPIPE 之前关闭 p1.stdout,如果我们已经关闭了 p1,那么 p1 如何知道 p2 在 p1 之前退出?