select()
और दोस्तों ने आपको वर्कफ़्लो को इस तरह से डिज़ाइन करने दिया है कि एक सॉकेट की धीमी गति उस गति को बाधित नहीं करती है जिस पर आप दूसरी सेवा कर सकते हैं। कल्पना करें कि डेटा प्राप्त करने वाली सॉकेट से तेज़ी से आता है और आप जितनी जल्दी हो सके इसे स्वीकार करना चाहते हैं और मेमोरी बफर में स्टोर करना चाहते हैं। लेकिन भेजने वाली सॉकेट धीमी है। जब आप ओएस के भेजने वाले बफर भर चुके हैं और send()
ने आपको EWOULDBLOCK दिया है, तो आप सॉकेट प्राप्त करने और भेजने दोनों पर प्रतीक्षा करने के लिए चुनिंदा() जारी कर सकते हैं। select()
तब प्राप्त होगा जब प्राप्तकर्ता सॉकेट पर कोई नया डेटा आ जाएगा, या कुछ बफर मुक्त हो जाते हैं और आप भेजने वाली सॉकेट में अधिक डेटा लिख सकते हैं, जो भी पहले होता है।
बेशक select()
के लिए एक और यथार्थवादी उपयोग केस तब होता है जब आपके पास पढ़ने और/या लिखने के लिए एकाधिक सॉकेट होते हैं, या जब आपको दोनों दिशाओं में अपने दो सॉकेट के बीच डेटा पास करना होगा।
वास्तव में, select()
आपको बताता है कि सॉकेट पर अगला पढ़ने या लिखने का ऑपरेशन सफल होने के लिए जाना जाता है, इसलिए यदि आप केवल चुनने और लिखने का प्रयास करते हैं तो चयन करने की अनुमति देता है, तो आपका प्रोग्राम लगभग काम करेगा, भले ही आपने नहीं किया सॉकेट को अवरुद्ध करना!यह अभी भी मूर्ख नहीं है, क्योंकि select()
के बावजूद अगला ऑपरेशन अभी भी अवरुद्ध हो सकता है, क्योंकि सॉकेट "तैयार" के रूप में सॉकेट है।
दूसरी ओर, select()
का उपयोग न करने वाले सॉकेट को गैर-अवरुद्ध करना और reason explained by @Troy की वजह से लगभग कभी सलाह नहीं दी जाती है।
शायद यह आपके कार्यान्वयन के सभी विवरण हैं। क्या तुमने कोशिश की? –
जब आप लगातार पढ़ने के लिए कोई डेटा नहीं रखते हैं तो आप क्या करने जा रहे हैं? लूप हमेशा के लिए? या चयन या मतदान या एपोल का उपयोग करें ?? अवरुद्ध या अनब्लॉक करने के बावजूद, आपको किसी भी तरह से डेटा की प्रतीक्षा करनी होगी। – goji
हाँ, जैसा कि @ ट्रॉय ने कहा था, इस तरह आप सक्रिय प्रतीक्षा लागू करेंगे - जिसका मतलब प्रोसेसर के लिए कोई दया नहीं है, जब पढ़ने के लिए कुछ भी नहीं है। – zoska