第17.1.4.2节:替换 python子进程模块的shell管道表示要替换
output=`dmesg | grep hda`
Run Code Online (Sandbox Code Playgroud)
同
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]
Run Code Online (Sandbox Code Playgroud)
对第三行的评论解释了为什么调用close函数,而不是为什么它有意义.对我来说,它没有.调用通信方法之前是否会关闭p1.stdout以防止通过管道发送任何输出?(显然它不会,我试图运行代码,它运行正常).为什么有必要调用close来使p1接收SIGPIPE?什么样的亲密关闭?究竟是什么关闭?
请考虑这是一个学术问题,除了更好地理解这些事情之外我不想做任何事情.
and*_*ski 10
您正在关闭p1.stdout的父进程,从而留下的dmesg作为与文件描述符只开放进程.如果你没有这样做,即使dmesg关闭它的标准输出,你仍然会打开它,并且SIGPIPE不会生成.(操作系统基本上保持引用计数,并SIGPIPE在它达到零时生成.如果不关闭文件,则可以防止它达到零.)
| 归档时间: |
|
| 查看次数: |
3011 次 |
| 最近记录: |