Ponieważ Twój program może czekać na we / wy lub w inny sposób zawieszony. SIGPIPE przerywa program asynchronicznie, kończąc wywołanie systemowe, dzięki czemu może być obsłużony natychmiast.
Aktualizacja
Rozważ rurociąg A | B | C
.
Dla jasności przyjmiemy, że B jest kanoniczną pętlą kopiowania:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
write(STDOUT,bufr,sz);
B
jest blokowany w wywołaniu read (2) oczekującym na dane od A
momentu C
zakończenia. Jeśli czekasz na kod powrotu z write (2) , kiedy B go zobaczy? Odpowiedź oczywiście nie brzmi, dopóki A nie zapisze większej ilości danych (co może oznaczać długie oczekiwanie - a co, jeśli A zostanie zablokowane przez coś innego?). Zauważ przy okazji, że to również pozwala nam na prostszy, czystszy program. Jeśli polegałeś na kodzie błędu z zapisu, potrzebujesz czegoś takiego:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
if(write(STDOUT,bufr,sz)<0)
break;
Kolejna aktualizacja
Aha, jesteś zdezorientowany co do zachowania pisma. Widzisz, kiedy deskryptor pliku z oczekującym zapisem jest zamknięty, SIGPIPE dzieje się natychmiast. Podczas gdy zapis w końcu zwróci -1 , celem sygnału jest asynchroniczne powiadomienie, że zapis nie jest już możliwy. Jest to część tego, co sprawia, że cała elegancka współrutyna struktura potoków działa w systemie UNIX.
Mógłbym teraz wskazać Ci całą dyskusję w dowolnej z kilku książek o programowaniu w systemach UNIX, ale jest lepsza odpowiedź: możesz to sprawdzić samodzielnie. Napisz prosty B
program [1] - masz już odwagę, wszystko czego potrzebujesz to a, main
a niektóre zawierają - i dodaj obsługę sygnału dla SIGPIPE
. Uruchom potok, taki jak
cat | B | more
aw innym oknie terminala dołącz debugger do B i umieść punkt przerwania wewnątrz procedury obsługi sygnału B.
Teraz zabij więcej, a B powinien włamać się do twojego modułu obsługi sygnału. zbadaj stos. Przekonasz się, że odczyt jest nadal w toku. niech obsługa sygnału kontynuuje i wraca, i spójrz na wynik zwrócony przez write - który będzie wtedy wynosił -1.
[1] Oczywiście napiszesz swój program B w C. :-)
write
.