+1 Greg Hewgill उत्तर देने के लिए सही दिशा में मेरी विचार प्रक्रिया को आगे बढ़ाने के लिए।
दोनों सॉकेट और पाइप में SIGPIPE
का असली कारण फिल्टर idiom/पैटर्न है जो यूनिक्स सिस्टम में सामान्य I/O पर लागू होता है।
पाइप से शुरू हो रहा है। Grep जैसे फ़िल्टर प्रोग्राम आमतौर पर STDOUT
पर लिखते हैं और STDIN
से पढ़ते हैं, जिन्हें शैल द्वारा पाइप पर रीडायरेक्ट किया जा सकता है। उदाहरण के लिए:
cat someVeryBigFile | grep foo | doSomeThingErrorProne
खोल जब यह कांटे और उसके बाद कार्यकारी के इन कार्यक्रमों शायद dup2
सिस्टम कॉल का उपयोग करता रीडायरेक्ट करने के लिए STDIN
, STDOUT
और STDERR
उचित पाइप के लिए।
के बाद से फिल्टर कार्यक्रम grep
पता नहीं है और जानते हुए भी कि यह उत्पादन फिर अगर doSomeThingErrorProne
दुर्घटनाओं की वापसी मान के बाद से एक संकेत के साथ है एक टूटी हुई पाइप के लिए लिख रोकने के लिए यह बताने के लिए एक ही रास्ता रीडायरेक्ट किया गया है का कोई रास्ता नहीं है STDOUT
पर लिखते हैं शायद ही कभी चेक किए जाते हैं।
सॉकेट के साथ एनालॉग inetd
सर्वर खोल खोलने वाला सर्वर होगा।
उदाहरण के तौर पर मुझे लगता है कि आप grep
को नेटवर्क सेवा में बदल सकते हैं जो TCP
सॉकेट से अधिक संचालित करता है।
grep 8000/tcp # grep server
फिर /etc/inetd.conf
से जोड़ें::
grep stream tcp nowait root /usr/bin/grep grep foo
inetd
को SIGHUP
भेजें और पोर्ट से कनेक्ट inetd
साथ उदाहरण के लिए आप TCP
बंदरगाह पर एक grep
सर्वर 8000 तो /etc/services
में जोड़ना चाहते हैं, तो टेलनेट के साथ 8000। इससे inetd
कांटा, STDIN
, STDOUT
और STDERR
पर सॉकेट को डुप्लिकेट करना चाहिए और उसके बाद foo के साथ foo के साथ grep
निष्पादित करना चाहिए। यदि आप टेलनेट grep
में टाइपिंग लाइन शुरू करते हैं तो उन पंक्तियों को प्रतिबिंबित करेंगे जिनमें foo शामिल है।
अब उदाहरण के लिए STDOUT
वास्तविक समय शेयरों के भाव की एक धारा लिखते हैं और STDIN
पर आदेशों हो जाता है कि ticker
नाम के एक कार्यक्रम के साथ टेलनेट बदलें।सूर्य माइक्रोसिस्टम्स के लिए उद्धरण प्राप्त करने के लिए पोर्ट 8000 के लिए कोई टेलनेट और "जावा शुरू करें" टाइप करें। फिर वे उठते हैं और दोपहर के भोजन के लिए जाते हैं। टेलनेट अस्पष्ट रूप से दुर्घटनाग्रस्त हो जाता है। यदि भेजने के लिए ticker
भेजने के लिए हमेशा उद्धरण भेजना जारी रहेगा, कभी नहीं जानते कि दूसरी छोर पर प्रक्रिया क्रैश हो गई है, और सिस्टम संसाधनों को बेकार कर दिया गया है।
यहां कुछ और चल रहा है जो काफी सूक्ष्म है: एक टीसीपी कनेक्शन आधा बंद हो सकता है, जिसका अर्थ है कि एक तरफ ने सॉकेट बंद कर दिया है (एक एफआईएन पैकेट भेजा है), लेकिन दूसरी तरफ अभी भी डेटा भेजने के लिए है। यदि आप इस स्तर पर चारों ओर घूम रहे हैं, तो कृपया पढ़ें: http://superuser.com/questions/298919/what-is-tcp-half-open-connection-and-tcp-half-closed-connection – rbp