Un processo riceve un SIGPIPE quando tenta di scrivere su una pipe (denominata o no) o su un socket di tipo SOCK_STREAM a cui non è rimasto alcun lettore.
In genere è un comportamento ricercato. Un esempio tipico è:
find . | head -n 1
Non si desidera findcontinuare a funzionare una volta headterminato (e quindi chiuso l'unico descrittore di file aperto per la lettura su quella pipe).
Il yescomando si basa in genere su quel segnale per terminare.
yes | some-command
Scriverà "y" fino a quando un comando non termina.
Nota che non è solo quando i comandi escono, è quando tutti i lettori hanno chiuso la loro lettura fd sulla pipe. Nel:
yes | ( sleep 1; exec <&-; ps -fC yes)
1 2 1 0
Ci sarà 1 (la subshell), quindi 2 (subshell + sleep), quindi 1 (subshell) quindi 0 fd che legge dalla pipe dopo che la subshell chiude esplicitamente il suo stdin, ed è allora yesche riceverà un SIGPIPE.
Sopra, la maggior parte delle shell usa a pipe(2) po ' ksh93usa a socketpair(2), ma il comportamento è lo stesso in questo senso.
Quando un processo ignora il SIGPIPE, la chiamata di sistema di scrittura (in genere write, ma potrebbe essere pwrite, send, splice...) ritorna con un EPIPEerrore. Quindi i processi che vogliono gestire manualmente il tubo rotto in genere ignorano SIGPIPE e agiscono in caso di errore EPIPE.