2

コード スニペット: http://docs.python.org/3/library/subprocess.html#replacing-shell-pipeline

output=`dmesg | grep hda`
# becomes
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]

質問: この行が必要な理由がよくわかりません: p1.stdout.close()? これを行うことで、データの出力が完全に完了する前に p1 stdout が閉じられ、p2 がまだ生きている場合はどうなりますか? p1.stdoutすぐに閉鎖することで、それを危険にさらしていませんか?これはどのように作動しますか?

4

2 に答える 2

2

p1.stdout.close()ファイル記述子のPython のコピーを閉じます。p2はすでにその記述子を ( 経由でstdin=p1.stdout) 開いているため、Python の記述子を閉じても には影響しませんp2。ただし、パイプの端が一度だけ開かれるようになったため、閉じると (たとえば、p2死んだ場合)、p1パイプが閉じられ、 が取得されますSIGPIPE

p1.stdoutPython で閉じずにp2死亡した場合、 p1Python の記述子がパイプを開いたままにしておくため、シグナルが得られません。

于 2013-09-24T04:51:07.733 に答える