अपने तर्कों को संशोधित करता है का चयन करें। आपको हर बार इसे फिर से शुरू करना होगा।
यदि आप ओवरहेड के बारे में चिंतित हैं, तो कर्नेल में पूर्ण FD_SET को संसाधित करने की लागत FD_ZERO की लागत से कुछ अधिक महत्वपूर्ण है। कर्नेल प्रसंस्करण को कम करने के लिए, आप केवल अपने अधिकतम एफडी में, FD_SETSZIZE नहीं, केवल पास करना चाहते हैं। अपने उदाहरण में:
switch (select((sd + 1),&set,NULL,NULL,&timeout))
कई एफडी साथ एक अधिक जटिल मामले के लिए, आप आम तौर पर एक अधिकतम चर को बनाए रखने के अंत:
FD_SET(sd,&set);
if (sd > max) max = sd;
... repeat many times...
switch (select((max + 1),&set,NULL,NULL,&timeout))
आप फ़ाइल वर्णनकर्ता की एक बड़ी संख्या है और कर रहे हैं जाएगा उन्हें स्केलपिंग के ऊपरी हिस्से के बारे में चिंतित, आपको चुनने के कुछ विकल्पों को देखना चाहिए()। आप ओएस आप उपयोग कर रहे उल्लेख नहीं है, लेकिन यूनिक्स की तरह OSes के लिए देखते हैं कुछ:
लिनक्स के लिए
- , epoll()
FreeBSD/NetBSD/OpenBSD/MacOS एक्स, kqueue के लिए
- () सोलारिस,/dev/चुनाव
एपीआई अलग हैं, लेकिन वे सभी अनिवार्य रूप से सक्रिय फ़ाइल विवरण का एक सेट बनाए रखने के लिए एक स्टेटफुल गिरी इंटरफेस रहे हैं के लिए
। एक बार एफडी को सेट में जोड़ा जाने के बाद, आपको उस एफडी पर घटनाओं के बारे में अधिसूचित किया जाएगा, बिना इसे लगातार पास किए।
मुझे लगता है कि आपके द्वारा निकाले गए कुछ कोड समझने में महत्वपूर्ण हो सकते हैं कि यह किस तरह से व्यवहार कर रहा है। – SoapBox