2011-04-13 20 views
5

मैं कुछ कोड के साथ काम कर रहा हूं जिसे SIGPIPE के कारण कॉलर को मारने के खिलाफ सुरक्षित होना आवश्यक है, लेकिन एकमात्र सॉकेट लिखता है कि यह प्रदर्शन करने वाला डेटाग्राम सॉकेट (यूडीपी और यूनिक्स डोमेन डेटाग्राम सॉकेट दोनों) पर जा रहा है। क्या मुझे SIGPIPE के बारे में चिंता करने की ज़रूरत है? मैं सॉकेट पर connect का उपयोग कर रहा हूं, लेकिन प्रारंभिक परीक्षण (लिनक्स पर) ने दिखाया है कि अगर यूनिक्स डोमेन सॉकेट पर कोई भी नहीं सुन रहा है तो मुझे ECONNREFUSED मिल जाएगा। सुनिश्चित नहीं है कि यूडीपी के साथ क्या होता है।कभी भी एक डेटाग्राम सॉकेट को लिख सकते हैं कभी भी सिगिप उठाएं?

SIGPIPE से छुटकारा पाने के लिए मैं पूरी चीज हैक में लपेट सकता हूं, लेकिन यदि यह एक गैर-मुद्दा है तो मैं ओवरहेड को सहेजता हूं और कोड जटिलता को नीचे रखता हूं।

+0

मैं आपको एक बुरा जवाब देने जा रहा हूं। मुझे लगता है कि मैंने इसे एक एप्लीकेशन शुरू करने से पहले देखा है क्योंकि लिनक्स सिस्टम बूटिंग कर रहा था। मैं यह नहीं कह सकता कि यह निश्चित रूप से एक डेटाग्राम सॉकेट था जो अंतर्निहित मुद्दा था, लेकिन जहां तक ​​मुझे पता है कि हमने उस एप्लिकेशन के लिए किसी भी टीसीपी सॉकेट का उपयोग नहीं किया है। आपके लिए यह विचार करने के लिए सिर्फ एक परीक्षण केस है कि यह आपके लिए लागू हो सकता है या नहीं। – Jeff

+0

मुझे लगता है कि मैं सिर्फ 'लिखने' की बजाय 'sendto' का उपयोग करने के लिए चीजों की व्यवस्था कर सकता हूं, इसलिए मैं उस ध्वज को पार कर सकता हूं जो 'सिगिप' को अक्षम करता है। –

उत्तर

8

जवाब send के लिए विनिर्देश में है:

[EPIPE] सॉकेट लिखने के लिए बंद हो जाता है, या सॉकेट कनेक्शन मोड है और अब जुड़ा हुआ है। बाद के मामले में, और यदि सॉकेट SOCK_STREAM या SOCK_SEQPACKET प्रकार है और MSG_NOSIGNAL ध्वज सेट नहीं है, तो सिगिपिप सिग्नल कॉलिंग थ्रेड पर जेनरेट किया गया है।

http://pubs.opengroup.org/onlinepubs/9699919799/functions/send.html

इस प्रकार, नहीं, आंकड़ारेख सॉकेट के लिए लिखते हैं SIGPIPE या एक EPIPE त्रुटि उत्पन्न नहीं है।

+0

क्या उपर्युक्त पाठ वास्तव में नहीं कहता है कि यदि आप "सॉकेट लिखने के लिए बंद हो जाते हैं" (यदि इसका मतलब है) तो आप इसे * यूडीपी में प्राप्त कर सकते हैं? –

+0

@ टी.ई.डी .: शायद (अगर शटडाउन-टू-राइट डेटाग्राम सॉकेट पर काम करता है), लेकिन यह ऐसी स्थिति है जो प्रोग्रामर इरादे या त्रुटि के बिना नहीं होती है। यह सहकर्मी के कारण नहीं है। –

1
man 2 write मेरी डेबियन बॉक्स पर के अनुसार

,

EPIPE: fd एक पाइप या सॉकेट जिसका पढ़ने अंत बंद कर दिया है से जुड़ा है। जब ऐसा होता है तो लेखन प्रक्रिया को एक सिगिप सिग्नल भी प्राप्त होगा। (इस प्रकार, लिखना मूल्य केवल तभी देखा जाता है जब प्रोग्राम इस सिग्नल को पकड़ता है, ब्लॉक करता है या अनदेखा करता है।)

ऐसा लगता है कि सॉकेट पर लिखते समय सिगिपिप प्राप्त करना संभव है, लेकिन यह स्पष्ट नहीं है कि यह हो सकता है या नहीं विशेष रूप से यूडीपी सॉकेट के लिए।

+0

'send' के लिए मैन पेज कुछ और विशिष्ट है, लेकिन यह उतना स्पष्ट नहीं है जितना POSIX' send' के बारे में बताता है .. –

+0

दरअसल, @ आर ... मैंने इसे पोस्ट करने के बाद आपके उत्तर सेकंड को हटा दिया। मैं सिर्फ अपनी पोस्ट के साथ गेंद रोलिंग करने के लिए मतलब था। – ikegami

8

खुला समूह एक बात है, और ऐप्पल एक और है। आईओएस पर एक मृत यूडीपी सॉकेट को लिखते समय एक SIGPIPE प्राप्त करना निश्चित रूप से संभव है, क्योंकि मेरे कुछ क्रैश लॉग हाल ही में प्रकट हुए हैं। ऐप पृष्ठभूमि में होने पर यूडीपी सॉकेट को बंद कर देता है, इन सॉकेट्स को लिखना एक सिगिप पॉप कर सकता है।
मेरी दुर्घटना लॉग से (testflightapp के सौजन्य से):

अपवाद ताजा शिकार घटनाओं
SIGPIPE
2 libsystem_c.dylib 0x32df47ec _sigtramp + 48
3 तत्काल बात 0x0005b10e - [IPRSNetDatagramSocket भेजें: आकार: करने के लिए: ] (iprs_iphone_net.m: 671) ...

लिनक्स, सोलारिस या Windows पर हो रहा याद मत करो - हालांकि मैं एक सॉकेट बंद करने के लिए और फिर इसे करने के लिए लिखने की कोशिश कभी नहीं।

+0

सॉकेट बंद करने के बाद इसे लिखना 'सिगिपी' या 'ईपीआईपीई' नहीं देगा; यह 'ईबीएडीएफ 'देगा। आईओएस को 'SIGPIPE' के कारण सॉकेट को कुछ विशेष गैर-मानक मोड में डालना होगा। किसी भी मामले में मेरा प्रश्न POSIX टैग किया गया था क्योंकि मैं मानक व्यवहार की तलाश में था, लेकिन आपका उत्तर भी जानकारीपूर्ण है। –

संबंधित मुद्दे