2012-02-06 16 views
40

epoll के आदमी पृष्ठ से:एपोल के एज ट्रिगर विकल्प का उद्देश्य क्या है?

epoll is a variant of poll(2) that can be used either as an edge-triggered 
or a level-triggered interface 

जब एक किनारे विकल्प चालू होने का प्रयोग करेंगे? मैन पेज एक उदाहरण देता है जो इसका उपयोग करता है, लेकिन मुझे नहीं लगता कि उदाहरण में यह क्यों जरूरी है।

उत्तर

77

जब एक एफडी पढ़ने के लिए या के लिए तैयार बारे में हो जाता है, तो आप जरूरी नहीं कि पढ़ने के लिए तुरंत चाहते हो सकता है (या लिखना) सभी डेटा।

लेवल-ट्रिगर एपोल आपको तब तक परेशान रखेगा जब तक कि एफडी तैयार रहता है, जबकि अगली बार जब तक आप EAGAIN प्राप्त नहीं करते हैं तब तक एज-ट्रिगर आपको परेशान नहीं करेगा (इसलिए यह कोड के आसपास अधिक जटिल है, लेकिन हो सकता है आपको जो करना है उसके आधार पर अधिक कुशल)।

कहें कि आप संसाधन से एक एफडी में लिख रहे हैं। यदि आप उस एफडी के लिए अपनी रुचि पंजीकृत करते हैं जो स्तर-ट्रिगर के रूप में तैयार हो रहा है, तो आपको लगातार अधिसूचना मिल जाएगी कि एफडी अभी भी लेखन के लिए तैयार है। यदि संसाधन अभी तक उपलब्ध नहीं है, तो यह जागने का अपशिष्ट है, क्योंकि आप वैसे भी लिख नहीं सकते हैं।

आप इसे जोड़ने के लिए के रूप में बढ़त ट्रिगर बजाय, आप सूचना है कि एफडी एक बार तैयार लिख रहा था, तो जब अन्य संसाधन तैयार आप आप कर सकते हैं जितना लिखना हो जाता है मिलता था तो। फिर यदि write(2)EAGAIN लौटाता है, तो आप लिखना बंद कर देते हैं और अगली अधिसूचना का इंतजार करते हैं।

वही पढ़ने के लिए लागू होता है, क्योंकि आप जो कुछ भी करना चाहते हैं, उसके लिए तैयार होने से पहले आप सभी डेटा को उपयोगकर्ता-स्थान में खींचना नहीं चाहते हैं (इस प्रकार इसे बफर करना आदि)। किनारे से ट्रिगर किए गए एपोल के साथ आपको बताया जाता है कि यह पढ़ने के लिए तैयार है, और फिर उसे याद कर सकते हैं और "जैसे और कब" वास्तविक पढ़ने को कर सकते हैं।

+3

क्या यह एज-ट्रिगर व्यवहार दौड़ की स्थिति के विरुद्ध सुरक्षित है, उदा। यदि 'ईडैन' के साथ 'रीड' विफल होने के बाद डेटा उपलब्ध हो जाता है लेकिन 'एपोल' से पहले कहा जाता है? –

+0

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

+17

ईटी मल्टीकोर मशीन पर एक बहुप्रचारित सर्वर के साथ भी विशेष रूप से अच्छा है। आप एक थ्रेड प्रति कोर चला सकते हैं और उनमें से सभी एक ही epfd पर epoll_wait को कॉल कर सकते हैं। जब डेटा एफडी पर आता है, तो इसे संभालने के लिए बिल्कुल एक धागा जागृत किया जाएगा। –

3

मेरी प्रयोगों में, एट गारंटी नहीं है कि केवल एक ही धागे जाग, हालांकि यह अक्सर केवल एक ही जाग। EPOLLONESHOT झंडा इस उद्देश्य के लिए है।

+2

'आदमी 7 epoll': चूंकि भी बढ़त ट्रिगर' epoll' साथ, कई घटनाओं डेटा के कई मात्रा के प्राप्त होने पर उत्पन्न किया जा सकता, फोन करने वाले 'EPOLLONESHOT' ध्वज को निर्दिष्ट करने का विकल्प है,' epoll' बताने के लिए निष्क्रिय करने के लिए 'epoll_wait (2)' के साथ किसी ईवेंट की प्राप्ति के बाद संबंधित फ़ाइल डिस्क्रिप्टर। जब 'EPOLLONESHOT' ध्वज निर्दिष्ट किया गया है, तो' epoll_ctl (2) '' EPOLL_CTL_MOD' के साथ फ़ाइल एस्क्रिप्टर को पुनः प्राप्त करने के लिए कॉलर की ज़िम्मेदारी है। – zeekvfu

+1

बिल्कुल, आपको प्रति बढ़ते किनारे पर एक बार अधिसूचित किया जाता है। यदि आप EPOLLET के रूप में एपोल सेट में stdin जोड़ते हैं, तो एंटर कुंजी की प्रत्येक प्रेस एक ईवेंट उत्पन्न करेगी। यही कारण है कि EPOLLONESHOT की आवश्यकता है। – Guido

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