Karena program Anda mungkin menunggu I / O atau ditangguhkan. SIGPIPE menginterupsi program Anda secara tidak sinkron, menghentikan panggilan sistem, sehingga dapat ditangani dengan segera.
Memperbarui
Pertimbangkan saluran pipa A | B | C
.
Hanya untuk kepastian, kita akan berasumsi bahwa B adalah loop salinan kanonik:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
write(STDOUT,bufr,sz);
B
diblokir pada panggilan baca (2) menunggu data dari A
saat C
berakhir. Jika Anda menunggu kode pengembalian dari write (2) , kapan B akan melihatnya? Jawabannya, tentu saja, tidak sampai A menulis lebih banyak data (yang bisa jadi menunggu lama - bagaimana jika A diblokir oleh sesuatu yang lain?). Perhatikan, omong-omong, ini juga memungkinkan kita membuat program yang lebih sederhana dan lebih bersih. Jika Anda bergantung pada kode kesalahan dari menulis, Anda memerlukan sesuatu seperti:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
if(write(STDOUT,bufr,sz)<0)
break;
Pembaruan lainnya
Aha, kamu bingung dengan perilaku penulisnya. Anda lihat, ketika deskriptor file dengan penulisan tertunda ditutup, SIGPIPE terjadi saat itu juga. Meskipun penulisan akan mengembalikan -1 pada akhirnya , inti dari sinyal ini adalah untuk memberi tahu Anda secara asinkron bahwa penulisan tidak lagi memungkinkan. Ini adalah bagian dari apa yang membuat seluruh struktur pipa rutin yang elegan berfungsi di UNIX.
Sekarang, saya dapat mengarahkan Anda ke seluruh diskusi di salah satu dari beberapa buku pemrograman sistem UNIX, tetapi ada jawaban yang lebih baik: Anda dapat memverifikasi ini sendiri. Menulis B
program sederhana [1] - Anda sudah punya nyali, yang Anda butuhkan hanyalah a main
dan beberapa termasuk - dan tambahkan penangan sinyal untuk SIGPIPE
. Jalankan pipa seperti
cat | B | more
dan di jendela terminal lain, pasang debugger ke B dan letakkan breakpoint di dalam penangan sinyal B.
Sekarang, bunuh lebih banyak dan B harus istirahat di penangan sinyal Anda. periksa tumpukannya. Anda akan mengetahui bahwa pembacaan masih menunggu keputusan. biarkan penangan sinyal melanjutkan dan kembali, dan melihat hasil yang dikembalikan oleh tulis - yang kemudian akan menjadi -1.
[1] Biasanya, Anda akan menulis program B Anda dalam C. :-)
write
.