Из Википедия , SIGPIPE - это сигнал, отправляемый процессу, когда он пытается записать в канал без процесса, подключенного к другому концу.
Когда вы впервые создаете p1
, используя stdout=PIPE
, к каналу подключен один процесс, который является вашим процессом Python, и вы можете прочитать вывод, используя p1.stdout
.
Когда вы создаете p2
с использованием stdin=p1.stdout
, теперь к каналу подключены два процесса p1.stdout
.
Обычно, когда вы запускаете процессы в конвейере, вы хотите, чтобы все процессы заканчивались, когда заканчивался какой-либо из процессов. Чтобы это произошло автоматически, вам нужно закрыть p1.stdout
, поэтому p2.stdin
- единственный процесс, присоединенный к этому каналу, таким образом, если p2
заканчивается и p1
записывает дополнительные данные в стандартный вывод, он получит SIGPIPE, так как есть больше нет процессов, связанных с этим каналом.