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 find
continuare a funzionare una volta head
terminato (e quindi chiuso l'unico descrittore di file aperto per la lettura su quella pipe).
Il yes
comando 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 yes
che riceverà un SIGPIPE.
Sopra, la maggior parte delle shell usa a pipe(2)
po ' ksh93
usa 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 EPIPE
errore. Quindi i processi che vogliono gestire manualmente il tubo rotto in genere ignorano SIGPIPE e agiscono in caso di errore EPIPE.