我在Python27中使用close_fds
时遇到了问题,经过一些研究后,我找到了这个示例:
from subprocess import Popen, PIPE, STDOUT
p1 = Popen(['cat'], stdin=PIPE, stdout=PIPE)
p2 = Popen(['grep', 'a'], stdin=p1.stdout, stdout=PIPE)
p1.stdin.write("aaaaaaaaaaaaaaaa\n")
p1.stdin.close()
p2.stdout.read()
我的问题是我不理解为什么 `p1.stdin` 保持打开状态。`p1` 不是 `p2` 的子进程,因此除了显式传递的 `p1.stdout` 外,`p2` 不应继承任何 `p1` 资源。此外,为什么在 `p2` 中设置 `close_fds=True` 可以解决这个问题?在这里写道:
因此,即使我能够理解 `p1` 和 `p2` 之间的继承关系,`p1.stdin` 也不应该被 `close_fds=True` 关闭,因为它是标准输入(1)。如果 close_fds 为 True,则在执行子进程之前会关闭除0、1和2之外的所有文件描述符。
p1.stdin
没有保持打开状态。在调用p1.stdin.close
之前,我检查了p2的打开fds,p2没有任何额外的fds。不确定为什么现在会发生这种情况。这是在Linux上。最近的实施有什么变化吗? - Tom