2011-10-13 11 views
11

मैंने हाल ही में फ़ाइल परिवर्तनों की निगरानी के लिए kqueueGCD dispatch sources का उपयोग करने से स्विच किया है। यह अच्छी तरह से काम किया है और परिणामस्वरूप एक बहुत आसान एपीआई है। मैंने अपना स्विच here दस्तावेज किया। मेरे पास एकमात्र मुद्दा यह है कि अब मैं उस घटना पर झंडे तक नहीं पहुंच सकता जिसे मैं क्यूक्यू में सक्षम था। kqueue साथ उदाहरण के लिए मैं जाँच करने के लिए करता है, तो फ़ाइल नष्ट कर दिया गया, नाम में सक्षम था, या यह की विशेषताओं के साथ निम्नलिखित बदल गया:ग्रांड सेंट्रल डिस्पैच (जीसीडी) प्रेषण स्रोत झंडे

struct kevent event; 

... 

if(event.flag & EV_DELETE) 
{ 
    printf("File was deleted\n"); 
} 

इस एपीआई GCD के साथ उपलब्ध नहीं है या मैं प्रेषण स्रोतों की स्थापना करने की आवश्यकता है प्रत्येक ध्वज के लिए मैं सुनना चाहूंगा। या यह क्यूक्यू का उपयोग करना सबसे अच्छा है क्योंकि यह घटना के लिए अधिक दृश्यता प्रदान करता है।

+3

मैंने वास्तव में आपका प्रश्न नहीं पढ़ा, लेकिन मैंने इसे ठोकर दिया ताकि आपकी प्रतिष्ठा 1337 हो। ठीक है, मैं इसे अभी पढ़ूंगा। – morningstar

उत्तर

8

मुझे Concurrency Programming Guide में उत्तर मिला। मैंने पहली बार GCD Reference में देखा लेकिन भाग्य के बिना। गाइड से प्रासंगिक पंक्ति

फ़ाइल सिस्टम गतिविधि पर नज़र रखने वाले एक वर्णक प्रेषण स्रोत के लिए, यह फ़ंक्शन लगातार घटना के प्रकार को इंगित करता है। स्थिरांक की सूची के लिए, dispatch_source_vnode_flags_t गणना प्रकार देखें।

यहां एक उदाहरण है कि आप इसका उपयोग कैसे कर सकते हैं।

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
int fildes = open("path/to/some/file", O_EVTONLY); 
__block dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE,fildes, 
                DISPATCH_VNODE_DELETE | DISPATCH_VNODE_WRITE | DISPATCH_VNODE_EXTEND | DISPATCH_VNODE_ATTRIB | DISPATCH_VNODE_LINK | DISPATCH_VNODE_RENAME | DISPATCH_VNODE_REVOKE, 
                queue); 
dispatch_source_set_event_handler(source,^
{ 
    unsigned long flags = dispatch_source_get_mask(source); 
    if(flags & DISPATCH_VNODE_DELETE) 
     printf("DISPATCH_VNODE_DELETE\n"); 
    if(flags & DISPATCH_VNODE_WRITE) 
     printf("DISPATCH_VNODE_WRITE\n"); 
    if(flags & DISPATCH_VNODE_EXTEND) 
     printf("DISPATCH_VNODE_EXTEND\n"); 
    if(flags & DISPATCH_VNODE_ATTRIB) 
     printf("DISPATCH_VNODE_ATTRIB\n"); 
    if(flags & DISPATCH_VNODE_LINK) 
     printf("DISPATCH_VNODE_LINK\n"); 
    if(flags & DISPATCH_VNODE_RENAME) 
     printf("DISPATCH_VNODE_RENAME\n"); 
    if(flags & DISPATCH_VNODE_REVOKE) 
     printf("DISPATCH_VNODE_REVOKE\n"); 
}); 
dispatch_source_set_cancel_handler(source, ^(void) 
{ 
    close(fildes); 
}); 
dispatch_resume(source); 
+0

धन्यवाद, यह अद्भुत है। मैंने आपके [ब्लॉग पोस्ट] पर एक का उपयोग किया (http://www.davidhamrick.com/2011/10/13/Monitoring-Files-With-GCD-Being-Edited-With-A-Text-Editor.html)। हालांकि, आपको लाइन 17 को '[ब्लॉक स्वयं घड़ी स्टाइलशीट: पथ] से सही करना चाहिए; 'to' [blockSelf watchConfigFile: path]; '। –

+0

'स्रोत' के लिए '__block' होने का कोई मतलब नहीं है क्योंकि इसे कभी असाइन नहीं किया गया है – user102008

3

आप * बदल सकते हैं dispatch_source_get_mask (स्रोत) * * dispatch_source_get_data (स्रोत) dispatch_source_get_mask (स्रोत) के रूप में *, करने के लिए सभी झंडे आप उत्पन्न घटना के बजाय हैंडलर के निर्माण में पारित कर दिया देता है।

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

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