Um processo recebe um SIGPIPE quando tenta gravar em um pipe (chamado ou não) ou no soquete do tipo SOCK_STREAM que não tem mais nenhum leitor.
Geralmente é um comportamento desejado. Um exemplo típico é:
find . | head -n 1
Você não deseja que find continue sendo executado depois que head tenha terminado (e, em seguida, fechado o único descritor de arquivo aberto para leitura nesse canal).
O comando yes normalmente depende desse sinal para finalizar.
yes | some-command
Escreve "y" até que algum comando termine.
Note que não é apenas quando os comandos saem, é quando todo o leitor fechou a leitura fd para o pipe. Em:
yes | ( sleep 1; exec <&-; ps -fC yes)
1 2 1 0
Haverá 1 (o subshell), depois 2 (subshell + sleep), depois 1 (subshell) e depois 0 fd lendo o pipe depois que a subshell fechar explicitamente seu stdin, e é quando yes receberá um SIGPIPE .
Acima, a maioria dos shells usa pipe(2) , enquanto ksh93 usa socketpair(2) , mas o comportamento é o mesmo nesse sentido.
Quando um processo ignora o SIGPIPE, a chamada do sistema de escrita (geralmente write , mas pode ser pwrite , send , splice ...) retorna com um erro EPIPE . Portanto, os processos que desejam manipular o canal quebrado manualmente normalmente ignorariam o SIGPIPE e agiriam sobre um erro EPIPE.