Grand Central Dispatch (GCD) dispatch source flags

前端 未结 2 1249
半阙折子戏
半阙折子戏 2021-02-05 21:41

I recently switched from using kqueue to GCD dispatch sources to monitor file changes. This has worked out well and resulted in a much simpler API. I documented my switch here.

相关标签:
2条回答
  • 2021-02-05 22:18

    You may change *dispatch_source_get_mask(source)* to *dispatch_source_get_data(source)*, as dispatch_source_get_mask(source) returns all the flags you passed in the creation of the handler instead of the event generated.

    0 讨论(0)
  • 2021-02-05 22:28

    I found the answer in the Concurrency Programming Guide. I had first looked in the GCD Reference but without luck. The relevant line from the guide was

    For a descriptor dispatch source that monitors file system activity, this function returns a constant indicating the type of event that occurred. For a list of constants, see the dispatch_source_vnode_flags_t enumerated type.

    Here is an example of how you can use it.

    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 讨论(0)
提交回复
热议问题