Сигнал SIGPIPE обычно отправляется, если процесс пытается записать в трубу, из которой нет активного процесса. В оболочке трубопровода эквивалент фрагмент кода:
`dmesg | grep hda`
Если grep
процесс по какой-то причине заканчивается до того dmesg
делается записи выходных данных, dmesg
получит SIGPIPE и прекратить себя. Это было бы ожидаемым поведением для процессов UNIX/Linux (http://en.wikipedia.org/wiki/Unix_signal).
В противоположность этому, в реализации Python с использованием subprocess
, если p2
завершил работу до p1
делается вывод генерации, то SIGPIPE не присылают, потому что на самом деле еще процесс, глядя на трубу - самого Python сценария (тот который создал p1
и p2
). Что еще более важно, сценарий смотрит на трубу, но не потребляет ее содержимое - эффект заключается в том, что труба удерживается на неопределенный срок, а p1
застревает в подвешенном состоянии.
Явное закрытие p1.stdout
отсоединяется сценарий Python из трубы и делает его таким образом, что ни один процесс, кроме p2
не смотрит на трубу - таким образом, если p2
это конец, прежде чем p1
, p1
правильно получает сигнал, чтобы закончить себя без чего-либо искусственно удерживая трубку открытой.
Вот альтернативно сформулировано объяснение: http://www.enricozini.org/2009/debian/python-pipes/
Возможный дубликат [Объяснить пример из модуля подпроцессов python] (http://stackoverflow.com/questions/6046779/explain-example-from-python-subprocess-module) –