2012-10-19 13 views
9

के साथ मेमोरी हैंडलिंग मैं epoll library के साथ सी में एक सर्वर विकसित कर रहा हूं और मेरे पास एक प्रश्न है कि struct epoll_event के लिए स्मृति को कैसे प्रबंधित किया जाता है।स्ट्रक्चर epoll_event

struct epoll_event ev; 
ev.events = EPOLLIN; 
epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev); 

अब हम सभी जानते हैं ev जब करने के लिए होता है: मुझे लगता है कि, जब epoll_ctl कॉल करने, events तर्क ढेर पर है, इसलिए की तरह आवंटित किया जाता है और फिर सूचक पारित हो जाता है कुछ ऑनलाइन उदाहरण में देखा है समारोह रिटर्न। मेरा सवाल है: क्या एपोल लाइब्रेरी आंतरिक रूप से इन मानों की प्रतियां बनाती है या क्या यह आपके द्वारा आवंटित ढेर के लिए पारित संरचना पर भरोसा करती है? क्या उपर्युक्त उदाहरण पूरी तरह से मेरे रिएक्टर कार्यान्वयन को तोड़ देगा? यदि हां, तो epoll_event structs आवंटित मेरे ढेर का ट्रैक रखने का सबसे अच्छा तरीका क्या है?

आपके समय के लिए धन्यवाद।

+0

यदि "हम सभी जानते हैं कि क्या होता है", तो आप क्यों पूछते हैं? –

+0

जब मैं कहता हूं "हम सभी जानते हैं कि क्या होता है" मेरा मतलब है कि फ़ंक्शन आवंटित होने पर स्टैक आवंटित स्मृति जारी की जाती है। –

उत्तर

11

सबकुछ ठीक है। epoll_ctl फ़ंक्शन सिस्टम कॉल के आस-पास एक साधारण रैपर है जो फ़ंक्शन लौटने पर पूरी तरह से पूरा हो जाएगा। उपयोगकर्ता स्पेस से कोई और डेटा आवश्यक नहीं है। संरचना तर्कों को पैकेज करने का एक तरीका है।

7

तुरंत अपने epoll_event संरचना को फेंकने या पुन: उपयोग करना ठीक है।

कर्नेल epoll_event संरचना से पैरामीटर कॉपी करेगा।

यह वही है जैसा आपने एक ioctl का उपयोग किया है जो एक पैरामीटर के रूप में एक संरचना लेता है, या एक सॉकेट ऑपरेशन (उदाहरण के लिए बाध्य) जो एक संरचना sockaddr_in लेता है।

कर्नेल इसे जो चाहिए उसे लेता है, और यह आपके लिए इसे ठीक करने के लिए तुरंत ठीक है।

केवल एक चीज जिसकी आपको चिंता करने की आवश्यकता है वह "उपयोगकर्ता डेटा" है, जो केवल आपके लिए प्रासंगिक है। कर्नेल इसे स्टोर करेगा, लेकिन आपको यह जानने की जरूरत है कि जब आप कोई ईवेंट प्राप्त करते हैं तो इसका क्या अर्थ है।

+0

धन्यवाद। Upvoted। मैं केरेक एसबी के जवाब को सही तरीके से चिह्नित करूंगा, क्योंकि उसने आपके सामने एक मिनट पहले जवाब दिया था। –

3

epoll लाइब्रेरी नहीं, सिस्कोल का एक सेट है। जब आप epoll सिस्कोल को कॉल करते हैं तो आप कर्नेल दर्ज करते हैं, और कर्नेल आम तौर पर इन उपयोगकर्ता मोड बफर पर भरोसा नहीं करता है, जो आवश्यक रूप से वैध या चारों ओर चिपकने के लिए है, बल्कि copy_from_user आदि के माध्यम से कर्नेल मेमोरी में प्रतिलिपि बनाते हैं। तो हाँ, आप structs को सेट अप कर सकते हैं ढेर, अपने पते को syscall में पास करें, फिर लौटने के बाद उन्हें छोड़ दें।

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