Объяснение примера конвейера из модуля подпроцесса Python

Раздел ] 17.1.4.2: Замена конвейера оболочки модуля подпроцесса python говорит о замене

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]

Комментарий к третьей строке объясняет, почему вызывается функция закрытия, но не объясняет, почему это имеет смысл. Не для меня. Не закроет p1.stdout до вызова метода связи, предотвратит отправку любого вывода через конвейер? (Очевидно, что это не так, я попытался запустить код и Почему необходимо вызвать close, чтобы p1 получил SIGPIPE? Что это за закрытие, которое не закрывается? Что именно, оно закрывается?

Пожалуйста, примите во внимание это академический вопрос, я не пытаюсь достичь чего-либо, кроме лучшего понимания этих вещей.

7
задан jimbo1qaz 28 August 2018 в 08:16
поделиться