gpt4 book ai didi

python - Python 子进程在什么情况下获得 SIGPIPE?

转载 作者:行者123 更新时间:2023-11-28 22:34:13 25 4
gpt4 key购买 nike

我正在阅读子进程模块部分中关于 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]

documentation还指出

"The p1.stdout.close() call after starting the p2 is important in order for p1 to receive a SIGPIPE if p2 exits before p1.

为什么必须在我们接收 SIGPIPE 之前关闭 p1.stdout?如果我们已经关闭 p1,p1 如何知道 p2 在 p1 之前退出?

最佳答案

SIGPIPE 是一个信号,如果 dmesg 试图写入一个关闭的管道,就会发送该信号。在这里,dmesg两个 要写入的目标结束,您的 Python 进程和 grep 进程。

那是因为 subprocess 克隆文件句柄(使用 os.dup2() function )。配置 p2 以使用 p1.stdout 会触发 os.dup2() 调用,要求操作系统复制管道文件句柄;副本用于将 dmesg 连接到 grep

dmesg stdout 有两个打开的文件句柄,如果只有 一个dmesg 永远不会被给予 SIGPIPE 信号它们中的一部分提前关闭,因此永远不会检测到 grep 关闭。 dmesg 会不必要地继续产生输出。

因此,通过立即关闭 p1.stdout,您可以确保从 dmesg stdout 读取的唯一剩余文件句柄是 grep 进程,如果该进程将退出,dmesg 收到一个 SIGPIPE

关于python - Python 子进程在什么情况下获得 SIGPIPE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39190250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com