2010-12-30 4 views
5

मुझे यूनिक्स में चयन फ़ंक्शन का उपयोग कर समस्या का सामना करना पड़ रहा है।क्या चयन सिस्टम कॉल के बीच fd_set को रीसेट करना आवश्यक है?

मेरे पास एक सर्वर है जो कनेक्शन के लिए इंतजार कर रहा है। सबसे पहले मैं FD_SET(listener, readfds) का उपयोग कर fd_set readfds पर सुनकर सॉकेट फ़ाइल डिस्क्रिप्टर listener जोड़ता हूं और फिर मैं select() में इसका उपयोग करता हूं।

जब मुझे कनेक्शन मिलता है, तो मैं accept() पर कॉल करता हूं और स्वीकृत फ़ाइल डिस्क्रिप्टर के साथ चयन में readfds सेट करता हूं और कनेक्शन से डेटा प्राप्त करना प्रारंभ करता हूं। हालांकि, जब मैं स्ट्रेस में कोड की जांच करता हूं, तो चयन readfds में श्रोता को नहीं दिखाता है जबकि select() दूसरी बार निष्पादित होता है।

मैं फिर से select() फिर से कॉल करने से पहले FD_SET(listener, readfds) का उपयोग कर श्रोता फ़ाइल वर्णनकर्ता निर्धारित करने की आवश्यकता है?

धन्यवाद।

+0

यह भी नहीं कि लिनक्स पर टाइमआउट मान संशोधित किया जा सकता है और इसलिए इसे फिर से शुरू करने की आवश्यकता भी होगी। मानक यह अनुमति देता है लेकिन यूनिक्स के अन्य स्वादों में यह असामान्य है। –

उत्तर

10

हां (fd_setselect() सिस्टम कॉल के बीच रीसेट करना आवश्यक है)।

यह एक उपद्रव है, लेकिन वे इनपुट/आउटपुट पैरामीटर के रूप में कार्य करते हैं; वे सिस्टम कॉल द्वारा पढ़ और संशोधित होते हैं। जब select() लौटाता है, तो मूल्यों को सभी फाइल डिस्क्रिप्टरों के सेट को प्रतिबिंबित करने के लिए संशोधित किया गया है। इसलिए, select() पर कॉल करने से पहले, आपको fd_set मानों को प्रारंभ करना होगा।

+0

मुझे आपका जवाब स्पष्ट रूप से नहीं मिला। क्या यह चुनिंदा रिटर्न के बाद है (जिसे मैं स्वीकार करता हूं) पढ़ा गया fd_set से रीसेट किया गया है जिसे मैं चुनने में डेटा प्राप्त करने के लिए देख रहा हूं। – sandeep

+0

धन्यवाद जोनाथन..यह अब स्पष्ट है। – sandeep

1

जोनाथन सही है। आपको हर बार निम्नलिखित करने की आवश्यकता है:

set readFDs 
set writeFDs 
set errorFDs 
select(count_of_FDs, readFDs, writeFDs, errorFDs, timeout) 
संबंधित मुद्दे