关闭管道python子进程的标准输出



以下是我在python子进程模块文档中可以读到的内容:

Replacing shell pipeline
    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]
The p1.stdout.close() call after starting the p2 is important in order for p1
to receive a SIGPIPE if p2 exits before p1.

我真的不明白为什么我们必须关闭p1。Stdout创建p2后。到底什么时候执行p1.stdout.close()?如果p2不结束会怎样?当p和p都不结束时会发生什么?

来自维基百科,SIGPIPE是当进程试图写入管道而另一端没有进程连接时发送给进程的信号。

当你第一次使用stdout=PIPE创建p1时,有一个进程连接到管道,这是你的Python进程,你可以使用p1.stdout读取输出。

当您使用stdin=p1.stdout创建p2时,现在有两个进程连接到管道p1.stdout

一般来说,当你在一个管道中运行进程时,你希望在任何进程结束时所有进程都结束。要自动执行此操作,您需要关闭p1.stdout,以便p2.stdin是附加到该管道的唯一进程,这样,如果p2结束并且p1向标准输出写入额外数据,它将收到SIGPIPE,因为不再有任何进程附加到该管道。

我明白了。p1。Stdout从我的python脚本中关闭,但在p2中保持打开,然后p1和p2一起通信。除非p2已经关闭,否则p1会接收一个SIGPIPE。我说的对吗?

最新更新