क्योंकि आपका कार्यक्रम I / O की प्रतीक्षा कर सकता है या अन्यथा निलंबित हो सकता है। SIGPIPE आपके प्रोग्राम को अतुल्यकालिक रूप से बाधित करता है, सिस्टम कॉल को समाप्त करता है, और इसलिए इसे तुरंत संभाला जा सकता है।
अपडेट करें
एक पाइपलाइन पर विचार करें A | B | C
।
निश्चितता के लिए, हम मान लेंगे कि B विहित प्रतिलिपि लूप है:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
write(STDOUT,bufr,sz);
B
पर अवरुद्ध है पढ़ने (2) से डेटा के लिए कॉल प्रतीक्षा A
जब C
समाप्त। यदि आप लिखने (2) से रिटर्न कोड की प्रतीक्षा करते हैं , तो B इसे कब देखेगा? उत्तर, निश्चित रूप से, तब तक नहीं है जब तक कि ए अधिक डेटा नहीं लिखता (जो एक लंबा इंतजार हो सकता है - क्या होगा अगर ए कुछ और द्वारा अवरुद्ध है?)। सूचना, जिस तरह से, यह भी हमें एक सरल, क्लीनर कार्यक्रम की अनुमति देता है। यदि आप लिखने से त्रुटि कोड पर निर्भर हैं, तो आपको कुछ इस तरह की आवश्यकता होगी:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
if(write(STDOUT,bufr,sz)<0)
break;
एक और अपडेट
अहा, आप लेखन के व्यवहार के बारे में भ्रमित हैं। आप देखें, जब लंबित लेखन के साथ फाइल डिस्क्रिप्टर बंद हो जाता है, तब SIGPIPE होता है। हालांकि लेखन -1 वापस आ जाएगा , आखिरकार संकेत का पूरा बिंदु आपको अतुल्यकालिक रूप से सूचित करना है कि अब लिखना संभव नहीं है। यह वह चीज है जो UNIX में पाइपों की पूरी सुरुचिपूर्ण सह-नियमित संरचना का काम करती है।
अब, मैं आपको कई UNIX सिस्टम प्रोग्रामिंग पुस्तकों में से किसी एक पर संपूर्ण चर्चा करने के लिए इंगित कर सकता हूं, लेकिन इसका एक बेहतर उत्तर है: आप इसे स्वयं सत्यापित कर सकते हैं। एक सरल B
कार्यक्रम लिखें [1] - आपको पहले से ही हिम्मत मिल गई है, आपको केवल एक की आवश्यकता है main
और कुछ में शामिल हैं - और के लिए एक सिग्नल हैंडलर जोड़ें SIGPIPE
। एक पाइपलाइन की तरह चलाएँ
cat | B | more
और एक अन्य टर्मिनल विंडो में, बी को डिबगर संलग्न करें और बी सिग्नल हैंडलर के अंदर एक ब्रेकपॉइंट लगाएं।
अब, अधिक को मारें और बी को आपके सिग्नल हैंडलर में तोड़ देना चाहिए। स्टैक की जांच करें। आप पाएंगे कि रीड अभी भी लंबित है। सिग्नल हैंडलर को आगे बढ़ने दें और वापस लौटें, और परिणाम को लिखकर देखें - जो तब -1 होगा।
[१] स्वाभाविक रूप से, आप सी में अपना बी प्रोग्राम लिखेंगे। :-)
write
।