gpt4 book ai didi

python - 解释 Python 子进程模块中的示例管道

转载 作者:太空狗 更新时间:2023-10-29 21:35:31 26 4
gpt4 key购买 nike

17.1.4.2: Replacing shell pipeline python 子进程模块的说要替换

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?不关闭算什么关闭?到底是什么关门了?

请认为这是一个学术问题,除了更好地理解这些事情之外,我并没有试图完成任何事情。

最佳答案

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

关于python - 解释 Python 子进程模块中的示例管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6046779/

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