2016-06-09 6 views
5

kqueue mechanism एक घटना झंडा, EV_RECEIPT, जो जुड़ा हुआ आदमी पृष्ठ के अनुसार है:केकेई के EV_RECEIPT के लिए वास्तव में क्या है?

... किसी भी लंबित घटनाओं खर्च किए बिना एक kqueue में एक साथ परिवर्तन बनाने के लिए उपयोगी है। इनपुट के रूप में पारित होने पर, यह हमेशा लौटने के लिए EV_ERROR को मजबूर करता है। जब फ़िल्टर सफलतापूर्वक जोड़ा गया तो डेटा फ़ील्ड शून्य हो जाएगा।

मेरे समझ हालांकि यह है कि यह किसी भी लंबित घटनाओं, बस kevent को nevents पैरामीटर के लिए 0 से गुजर रहा है और इस तरह कतार से कोई इवेंट बनाकर खर्च किए बिना एक kqueue में बल्क परिवर्तन करने के लिए तुच्छ है। इसे ध्यान में रखते हुए, EV_RECEIPT नीसमी क्यों है?

ओएस एक्स के लिए एप्पल दस्तावेज में कुछ sample code वास्तव में EV_RECEIPT उपयोग करता है:

kq = kqueue(); 

EV_SET(&changes, gTargetPID, EVFILT_PROC, EV_ADD | EV_RECEIPT, NOTE_EXIT, 0, NULL); 
(void) kevent(kq, &changes, 1, &changes, 1, NULL); 

लेकिन, changes सरणी के रूप में kevent कॉल के बाद जांच की कभी नहीं रही है देखकर, यह पूरी तरह से मेरे लिए स्पष्ट नहीं है क्यों EV_RECEIPT इस मामले में इस्तेमाल किया गया था ।

EV_RECEIPT वास्तव में आवश्यक है? वास्तव में यह किस स्थिति में उपयोगी होगा?

उत्तर

2

आप थोक परिवर्तन कर रहे हैं और उनमें से एक एक त्रुटि है, तो घटना EV_ERROR flags में स्थापित है और data में सिस्टम त्रुटि के साथ eventlist में रखा जाएगा का कारण बनता है, तो।

इसलिए यह पहचानना संभव है कि changelist तत्व त्रुटि का कारण बनता है।

यदि आप nevents शून्य पर सेट करते हैं, तो आपको त्रुटि कोड मिलता है लेकिन किसी भी घटना का कोई त्रुटि त्रुटि उत्पन्न नहीं करता है।

तो EV_RECEIPT आपको nevents को गैर-शून्य मान पर किसी लंबित ईवेंट को निकाले बिना सेट करने की अनुमति देता है।

+0

ठीक है, यह समझ में आता है, लेकिन यह ऐप्पल उदाहरण में कोड से संबंधित नहीं है जो मैंने लिंक किया था। उस कोड में टिप्पणी कहती है: _Create kqueue और SIGCHLD के लिए इसे देखने के लिए सेट अप करें। यह सुनिश्चित करने के लिए कि हम जो उम्मीद करते हैं उसे प्राप्त करने के लिए नए-इन -10.5 EV_RECEIPT ध्वज का उपयोग करें- हालांकि, यह केवल एक ही ईवेंट के साथ 'केवेन्ट' कहता है, 'EV_RECEIPT' का उपयोग करता है, और न तो 'केवेन्ट' से वापसी और न ही मूल्यों की जांच करता है घटनाओं को वापस करें। टिप्पणी के अर्थ के अनुसार कोई भी संकेत "हम जो उम्मीद करते हैं उसे प्राप्त करते हैं"? - या इस मामले में 'EV_RECEIPT' का उपयोग फर्जी है? – davmac

+0

मुझे लगता है कि इस मामले में, 'nevents' को शून्य पर सेट करना समान व्यवहार प्राप्त करेगा, क्योंकि वापसी मान की जांच नहीं की जाती है। लेकिन यह एक पैटर्न हो सकता है जिसे दूसरे कोड में दोहराया जाता है जहां वापसी मूल्य * चेक किया गया है। उम्मीद है कि नया फ़िल्टर वापस कर दिया गया है और * लंबित घटना नहीं *। –

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