Perché il tuo programma potrebbe essere in attesa di I / O o altrimenti sospeso. Un SIGPIPE interrompe il programma in modo asincrono, terminando la chiamata di sistema e quindi può essere gestito immediatamente.
Aggiornare
Considera una pipeline A | B | C
.
Solo per chiarezza, assumeremo che B sia il ciclo di copia canonico:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
write(STDOUT,bufr,sz);
B
è bloccato sulla chiamata di lettura (2) in attesa di dati da A
quando C
termina. Se aspetti il codice di ritorno da write (2) , quando lo vedrà B? La risposta, ovviamente, non è finché A non scrive più dati (il che potrebbe richiedere una lunga attesa - cosa succede se A è bloccato da qualcos'altro?). Si noti, a proposito, che questo ci consente anche un programma più semplice e pulito. Se dipendevi dal codice di errore della scrittura, avresti bisogno di qualcosa come:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
if(write(STDOUT,bufr,sz)<0)
break;
Un altro aggiornamento
Aha, sei confuso sul comportamento di chi scrive. Vedete, quando il descrittore di file con la scrittura in sospeso viene chiuso, il SIGPIPE si verifica in quel momento. Mentre la scrittura alla fine restituirà -1 , il punto centrale del segnale è notificarti in modo asincrono che la scrittura non è più possibile. Questo fa parte di ciò che fa funzionare l'intera elegante struttura co-routine delle pipe in UNIX.
Ora, potrei indicarti un'intera discussione in uno qualsiasi dei numerosi libri di programmazione del sistema UNIX, ma c'è una risposta migliore: puoi verificarlo tu stesso. Scrivi un semplice B
programma [1] - hai già il coraggio, tutto ciò di cui hai bisogno è un main
e alcuni include - e aggiungi un gestore di segnale per SIGPIPE
. Esegui una pipeline come
cat | B | more
e in un'altra finestra di terminale, collega un debugger a B e metti un punto di interruzione all'interno del gestore del segnale B.
Ora, uccidi di più e B dovrebbe rompere il tuo gestore di segnali. esaminare la pila. Scoprirai che la lettura è ancora in sospeso. lascia che il gestore del segnale proceda e ritorni, e guarda il risultato restituito da write - che sarà quindi -1.
[1] Naturalmente, scriverai il tuo programma B in C. :-)
write
.