当我浏览帖子时,我在这里遇到了这个例子,据说proc1.stdout.close()
需要调用适当的退出proc1
,生成SIGPIPE
。
import subprocess
proc1 = subprocess.Popen(['ps', 'cax'], stdout=subprocess.PIPE)
proc2 = subprocess.Popen(['grep', 'python'], stdin=proc1.stdout,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
out, err = proc2.communicate()
print('out: {0}'.format(out))
print('err: {0}'.format(err))
但是,我不清楚这一点。请修正我的理解。
SIGPIPE
当 aPIPE
尝试写入 closed时发生PIPE
。- 作家
PIPE
是proc1
的stdout
,读者PIPE
是proc2
的stdin
。 proc1
退出时将proc2
退出并proc1
尝试将数据写入proc2
'sstdin PIPE
。因为proc2
退出时stdin PIPE
关闭proc2
SIGPIPE
发生在,proc1
因为proc1
尝试写入已关闭proc2
的stdin PIPE
.
据我了解,无论收盘如何,SIGPIPE
都会发生并退出。proc1
proc1
stdout
我想念什么?
编辑
从@unutbu 的评论中阅读帖子后......
我认为复制的文件描述符(proc1.stdout
)是写入器管道,而不是读取器管道。因此,有两个写入器 PIPE 和一个读取器 PIPE 相互连接。
因此,SIGPIPE
将在proc2
退出时生成,因为proc2
只有一个具有阅读器管道的进程(退出时将关闭proc2
)。
但是,上面的帖子似乎说通过复制有两个阅读器 PIPE,proc1.stdout
因此SIGPIPE
即使退出后也不会生成,proc2
因为还有另一个阅读器 PIPE 打开。以下是帖子的一部分。
因此,通过立即关闭 p1.stdout,您可以确保从 dmesg stdout 读取的唯一剩余文件句柄是 grep 进程,如果该进程退出,dmesg 会收到 SIGPIPE。
我并不是说这个帖子是错误的,但我只是想修正我的理解。先感谢您。