2012-04-06 10 views
9

कहें कि मैं एक FD_SET पर चयन() को कॉल फ़ाइल डिस्क्रिप्टर का एक समूह शामिल करता हूं। क्या होता है यदि चयन() कॉल के दौरान, फाइल डिस्क्रिप्टर में से एक बंद हो जाता है? यह मानते हुए कि कुछ प्रकार की त्रुटि होती है, तो क्या सेट से बंद फ़ाइल डिस्क्रिप्टर को ढूंढना और निकालना मेरी ज़िम्मेदारी है?यूनिक्स: क्या होता है जब एक पठन फ़ाइल डिस्क्रिप्टर चुनते समय चयन करता है()

+0

ध्यान रखें कि जब आप चयन() कॉल के अंदर होते हैं तो एक एफडी_सेट में एक दायरलेखक रहना एकमात्र संभव तरीका बंद हो सकता है यदि कोई अन्य धागा बंद() है जो वर्णनकर्ता है। (सहकर्मी द्वारा बंद टीसीपी कनेक्शन होने या आपके स्थानीय टीसीपी/आईपी स्टैक एक और मामला है)। – nos

+0

यह भी देखें http://stackoverflow.com/questions/3884110/what-is-select-supposed-to-do-if-you-close-a-monitored-fd –

उत्तर

4

मुझे विश्वास नहीं है कि यह कहीं भी निर्दिष्ट है; कुछ सिस्टम तुरंत select से वापस आ सकते हैं जबकि अन्य अवरुद्ध करना जारी रख सकते हैं। ध्यान दें कि यह एकमात्र तरीका हो सकता है एक बहु थ्रेडेड प्रक्रिया में (अन्यथा, closeselect के दौरान नहीं हो सकता है; भले ही यह सिग्नल हैंडलर से हुआ हो, select सिग्नल द्वारा पहले से ही बाधित हो गया होगा)। इस प्रकार, यह स्थिति उत्पन्न होने से शायद संकेत मिलता है कि आपको चिंता करने के लिए बड़े मुद्दे हैं। यदि आपके द्वारा प्रदत्त फाइल डिस्क्रिप्टर में से एक को select के दौरान बंद किया जा सकता है, तो बड़ी समस्या यह है कि close के बाद तुरंत एक ही फ़ाइल डिस्क्रिप्टर को एक नई खुली फ़ाइल (जैसे किसी अन्य असंबंधित थ्रेड में खोला गया) में फिर से सौंप दिया जा सकता है, और थ्रेड यह मतदान तब गलत तरीके से आईओ को एक नई धागे से संबंधित "फाइल" से कर सकता है।

यदि आपके पास एक डेटा ऑब्जेक्ट है जिसमें फ़ाइल डिस्क्रिप्टर का एक सेट होता है जिसे बहुमत वाले प्रोग्राम में select के साथ मतदान किया जाएगा, तो आपको लगभग निश्चित रूप से उस सेट तक पहुंच नियंत्रित करने के लिए आदिम सिंक्रनाइज़ेशन का उपयोग करने की आवश्यकता होती है, और जोड़ना या फ़ाइल डिस्क्रिप्टर को हटाने के लिए एक लॉक की आवश्यकता होनी चाहिए जो select (या सदस्यों पर किसी भी आईओ) की संभावना के साथ परस्पर अनन्य है।

बेशक एक बहु थ्रेडेड प्रोग्राम में, select का उपयोग न करना बेहतर होगा और इसके बजाय कई थ्रेड में आईओ को अवरुद्ध करने के लिए जटिल लॉकिंग तर्क के बिना वांछित परिणाम प्राप्त करना चाहिए।

1

select() सिस्टम कॉल तीन fd_set पैरामीटर लेता है: भेजें, प्राप्त करें, अपवाद। जांचने के लिए, यदि रीडिंग फाइल डिस्क्रिप्टर पर कोई त्रुटि होती है तो इसे पढ़ने (प्राप्त) में और त्रुटि (exceprion) सेट में शामिल किया जाता है - select() से वापसी पर अपवाद सेट में इसे देखते हुए, उस सॉकेट पर एक अपवाद हुआ है, आपको पता लगाने का मौका क्या है।

किसी भी प्रकार के अपवाद के साथ सामान्य नेटवर्क सॉकेट में अब भेजने और प्राप्त करने के लिए उपयुक्त नहीं होगा।

+0

वास्तव में तत्काल डेटा के लिए 'removefds' का उपयोग किया जाता है। – cnicutar

+0

http://linux.die.net/man/2/select के साथ-साथ मेरा अनुभव अन्यथा कहता है: * "उन [फाइल डिस्क्रिप्टर] को छोड़कर अपवादों के लिए देखा जाएगा" * –

+0

मुझे अपने उत्तर को बढ़ावा देना पसंद नहीं है लेकिन मैंने एक लिंक और एक उद्धरण जोड़ा था। – cnicutar

1

भले ही आपने सभी भेजे गए डेटा को पढ़ लिया हो, फिर भी एक बंद सॉकेट को पढ़ने के लिए तैयार माना जाता है। उपलब्ध सॉकेट को इंगित करने के लिए अनब्लॉक करें चुनें।

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