epoll सेट अप करना
epoll सेट बनाएँ और पंजीकृत करें।
epoll सेट अप करना, CoddyKit पर C Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
epoll इंस्टेंस बनाना
सब कुछ एक epoll इंस्टेंस से शुरू होता है, जो स्वयं एक फ़ाइल वर्णनकर्ता होता है। इसे epoll_create1() से बनाएँ।
आर्ग्युमेंट फ़्लैग का फ़ील्ड होता है; डिफ़ॉल्ट व्यवहार के लिए 0 पास करें या exec() के दौरान वर्णनकर्ता को अपने-आप बंद करने के लिए EPOLL_CLOEXEC पास करें। लौटाया गया fd वही होता है जिसे आप epoll की हर दूसरी कॉल में पास करते हैं।
int epfd = epoll_create1(EPOLL_CLOEXEC);
if (epfd == -1) { perror("epoll_create1"); exit(1); }epoll_create1 बनाम epoll_create
पुराना epoll_create(int size) आकार का संकेत लेता था, लेकिन अब कर्नेल इसे अनदेखा करता है; केवल यह आवश्यक था कि इसका मान धनात्मक हो।
epoll_create1() को प्राथमिकता दें: यह अर्थहीन आकार के बजाय फ़्लैग लेता है और आपको EPOLL_CLOEXEC का अनुरोध परमाणु रूप से करने देता है, जिससे अलग fcntl() कॉल की आवश्यकता नहीं रहती।
/* legacy form, size arg ignored by kernel */
int epfd = epoll_create(1);epoll_event स्ट्रक्चर
रुचि और परिणाम, दोनों struct epoll_event के माध्यम से व्यक्त किए जाते हैं। इसमें एक events बिटमास्क और एक data यूनियन होता है।
data यूनियन में वह मान रखा जाता है जिसे इवेंट सक्रिय होने पर आप वापस पाना चाहते हैं: आम तौर पर data.fd, लेकिन यह आपके द्वारा बनाए गए कनेक्शन ऑब्जेक्ट के लिए data.ptr भी हो सकता है।
struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.fd = listen_fd;EPOLL_CTL_ADD के साथ पंजीकरण
epoll_ctl() रुचि-सूची का प्रबंधन करता है। किसी वर्णनकर्ता को देखना शुरू करने के लिए EPOLL_CTL_ADD ऑपरेशन का उपयोग करें।
आप epoll fd, ऑपरेशन, लक्ष्य fd और अपने epoll_event के लिए एक पॉइंटर पास करते हैं। इसके बाद epoll उस वर्णनकर्ता की तैयारी की सूचना देगा।
struct epoll_event ev = { .events = EPOLLIN, .data.fd = listen_fd };
if (epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd, &ev) == -1)
perror("epoll_ctl: add");इवेंट फ़्लैग: EPOLLIN और EPOLLOUT
events मास्क बताता है कि आप किन स्थितियों में रुचि रखते हैं। EPOLLIN का अर्थ है कि वर्णनकर्ता से पढ़ा जा सकता है; EPOLLOUT का अर्थ है कि उसमें लिखा जा सकता है।
आमतौर पर आप सुनने वाले सॉकेट पर EPOLLIN देखते हैं, ताकि कनेक्शन स्वीकार किए जा सकें, और क्लाइंट सॉकेट पर भी, ताकि डेटा पढ़ा जा सके। EPOLLOUT केवल तब जोड़ें जब आपके पास ऐसा बफ़र किया हुआ डेटा हो जो पूरी तरह भेजा नहीं जा सका।
ev.events = EPOLLIN | EPOLLOUT;त्रुटि और हैंग-अप फ़्लैग
कर्नेल कुछ स्थितियों की सूचना हमेशा देता है, भले ही आपने उनका अनुरोध न किया हो: त्रुटियों के लिए EPOLLERR, हैंग-अप के लिए EPOLLHUP और पीयर के आधे-कनेक्शन बंद करने के लिए EPOLLRDHUP।
अपने हैंडलर में इनकी जाँच करें; बंद हो चुके सॉकेट पर EPOLLHUP को अनदेखा करने से इवेंट लूप लगातार घूमता रह सकता है।
if (ev.events & (EPOLLERR | EPOLLHUP)) {
close(ev.data.fd);
continue;
}EPOLL_CTL_MOD के साथ रुचि बदलना
किसी वर्णनकर्ता के पंजीकृत हो जाने के बाद आप उसे हटाए बिना उसका इवेंट मास्क बदल सकते हैं। इसके लिए EPOLL_CTL_MOD का उपयोग करें।
एक सामान्य तरीका यह है: कोई कनेक्शन सामान्यतः केवल EPOLLIN देखता है, फिर उसका भेजने वाला बफ़र भरने पर EPOLLIN | EPOLLOUT पर बदल जाता है, और डेटा पूरी तरह भेजे जाने के बाद फिर से पहले जैसा हो जाता है।
ev.events = EPOLLIN | EPOLLOUT;
ev.data.fd = conn_fd;
epoll_ctl(epfd, EPOLL_CTL_MOD, conn_fd, &ev);EPOLL_CTL_DEL के साथ हटाना
जब कोई कनेक्शन बंद हो जाए, तो EPOLL_CTL_DEL से उसे देखना बंद करें। अंतिम epoll_event आर्ग्युमेंट को अनदेखा किया जाता है और आधुनिक कर्नेल में यह NULL हो सकता है।
ध्यान दें कि किसी वर्णनकर्ता को बंद करने पर वह अपने-आप सभी epoll रुचि-सूचियों से हट जाता है, लेकिन बंद करने से पहले स्पष्ट रूप से हटाने पर आपके अभिलेख स्पष्ट रहते हैं।
epoll_ctl(epfd, EPOLL_CTL_DEL, conn_fd, NULL);
close(conn_fd);लेवल-ट्रिगर्ड बनाम एज-ट्रिगर्ड
डिफ़ॉल्ट रूप से epoll लेवल-ट्रिगर्ड होता है: जब तक किसी वर्णनकर्ता से पढ़ा जा सकता है, हर epoll_wait() उसे रिपोर्ट करता है। यह सरल और आसानी से संभालने योग्य है।
एज-ट्रिगर्ड मोड के लिए EPOLLET फ़्लैग जोड़ें: आपको केवल तब सूचना मिलती है जब तैयारी की स्थिति बदलती है, इसलिए आपको EAGAIN तक लूप में सॉकेट को पूरी तरह खाली करना होगा।
ev.events = EPOLLIN | EPOLLET; /* edge-triggered */
epoll_ctl(epfd, EPOLL_CTL_ADD, conn_fd, &ev);कॉन्टेक्स्ट पॉइंटर संग्रहीत करना
data.fd के बजाय आप data.ptr में हर कनेक्शन के लिए बनाए गए स्ट्रक्चर का पता रख सकते हैं। इवेंट सक्रिय होने पर आपको वह पॉइंटर सीधे वापस मिल जाता है और किसी लुकअप तालिका की आवश्यकता नहीं होती।
बस यूनियन को याद रखें: यदि आप data.ptr सेट करते हैं, तो उसी इवेंट से data.fd भी नहीं पढ़ सकते।
struct conn *c = malloc(sizeof *c);
c->fd = conn_fd;
ev.events = EPOLLIN;
ev.data.ptr = c;
epoll_ctl(epfd, EPOLL_CTL_ADD, conn_fd, &ev);सफ़ाई करना
epoll इंस्टेंस केवल एक फ़ाइल वर्णनकर्ता होता है, इसलिए सर्वर बंद होने पर इसे close() से मुक्त करें।
epoll fd को बंद करने से कर्नेल की रुचि-सूची मुक्त हो जाती है। निगरानी में रखे गए और अभी खुले सॉकेट खुले रहते हैं; उनके संसाधन मुक्त करने के लिए उन्हें अलग से बंद करें।
close(epfd);त्वरित जाँच
epoll सेटअप API की अपनी समझ जाँचें।
पुनरावलोकन
आप epoll_create1() से एक इंस्टेंस बनाते हैं, फिर ADD, MOD और DEL का उपयोग करके epoll_ctl() के माध्यम से रुचि का प्रबंधन करते हैं। हर struct epoll_event में एक events मास्क और एक data यूनियन होता है।
सरलता के लिए लेवल-ट्रिगर्ड चुनें या एज-ट्रिगर्ड प्रदर्शन के लिए EPOLLET चुनें। अब हम इन हिस्सों को एक इवेंट लूप से चलाएँगे।
एआई शिक्षक के साथ C सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 39
- पाठ
- 144
अक्सर पूछे जाने वाले प्रश्न
क्या “epoll सेट अप करना” पाठ निःशुल्क है?
हाँ—“epoll सेट अप करना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“epoll सेट अप करना” में मैं क्या सीखूँगा?
epoll सेट बनाएँ और पंजीकृत करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“epoll सेट अप करना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Blocking बनाम Non-Blocking I/O
- epoll सेट अप करना
- Event Loop
- सरल Echo Server