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.