Çünkü programınız G / Ç bekliyor olabilir veya başka bir şekilde askıya alınabilir. Bir SIGPIPE, programınızı eşzamansız olarak kesintiye uğratır, sistem çağrısını sonlandırır ve böylece hemen işlenebilir.
Güncelleme
Bir boru hattı düşünün A | B | C.
Kesinlik için, B'nin kanonik kopya döngüsü olduğunu varsayacağız:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
write(STDOUT,bufr,sz);
Bengellenir okuma (2) verilerine için çağrı bekletme Ane zaman Csona erdiği. Eğer (2) yazısından dönüş kodunu beklerseniz , B onu ne zaman görecek? Elbette cevap, A daha fazla veri yazana kadar değil (ki bu uzun bir bekleme olabilir - ya A başka bir şey tarafından engellenirse?). Bu arada, bunun bize daha basit, daha temiz bir program sağladığına dikkat edin. Yazmadan kaynaklanan hata koduna bağlıysanız, aşağıdaki gibi bir şeye ihtiyacınız olacak:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
if(write(STDOUT,bufr,sz)<0)
break;
Başka bir güncelleme
Aha, yazının davranışı konusunda kafan karıştı. Gördüğünüz gibi, beklemedeki yazma ile dosya tanımlayıcı kapatıldığında, SIGPIPE hemen o anda gerçekleşir. Yazma sonunda -1 döndürürken , sinyalin tüm amacı, yazma işleminin artık mümkün olmadığını size eşzamansız olarak bildirmektir. Bu, boruların tüm zarif ortak rutin yapısının UNIX'te çalışmasını sağlayan şeyin bir parçasıdır.
Şimdi, sizi birkaç UNIX sistem programlama kitabının herhangi birindeki bütün bir tartışmaya yönlendirebilirim, ancak daha iyi bir cevap var: Bunu kendiniz doğrulayabilirsiniz. Basit bir Bprogram [1] yazın - cesaretiniz var, tek ihtiyacınız olan a mainve bazılarını içerir - ve bir sinyal işleyici ekleyin SIGPIPE. Gibi bir boru hattı çalıştırın
cat | B | more
ve başka bir terminal penceresinde, B'ye bir hata ayıklayıcı iliştirin ve B sinyal işleyicisinin içine bir kesme noktası koyun.
Şimdi, daha fazlasını öldürün ve B sinyal işleyicinizi kırsın. yığını inceleyin. Sen olduğunu göreceksiniz okuma hala beklemede. sinyal işleyicisinin ilerlemesine ve geri dönmesine izin verin ve write ile döndürülen sonuca bakın - bu daha sonra -1 olacaktır .
[1] Doğal olarak, B programınızı C'de yazacaksınız. :-)
write.