Объясните пример конвейера из модуля подпроцесса 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]

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

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

1 ответов


вы закрывающим тегом p1.stdout на родитель process, таким образом, оставляя dmesg единственным процессом с открытым файловым дескриптором. Если бы вы этого не сделали, даже когда dmesg закрыл свой stdout, он все равно был бы открыт, и SIGPIPE не будет сгенерирован. (ОС в основном сохраняет счетчик ссылок и генерирует SIGPIPE когда он достигает нуля. Если вы не закроете файл, он никогда не достигнет нуля.)