首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FSEvents C++示例

FSEvents C++示例
EN

Stack Overflow用户
提问于 2012-07-19 16:10:38
回答 1查看 4.5K关注 0票数 8

我需要为Mac中的一个文件夹创建FSEvents观察者。我对C++很满意,有没有一种方法可以用C++代码而不是Objective-C获得FSEvents通知。是否有一些示例代码可以开始,以及我需要包括的任何库?

我已经在这个页面上了。http://developer.apple.com/library/mac/#featuredarticles/FileSystemEvents/_index.html

但是好像只有目标C,能给我CPP版本吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-19 16:56:28

是的,这在C中是可能的。你应该寻找内核队列。

下面是一个监视该目录的小示例:

代码语言:javascript
复制
#include <errno.h>       // for errno
#include <fcntl.h>       // for O_RDONLY
#include <stdio.h>       // for fprintf()
#include <stdlib.h>      // for EXIT_SUCCESS
#include <string.h>      // for strerror()
#include <sys/event.h>   // for kqueue() etc.
#include <unistd.h>      // for close()

int main (int argc, const char *argv[])
{
   int kq = kqueue ();
   // dir name is in argv[1], NO checks for errors here
   int dirfd = open (argv[1], O_RDONLY);

   struct kevent direvent;
    EV_SET (&direvent, dirfd, EVFILT_VNODE, EV_ADD | EV_CLEAR | EV_ENABLE,
            NOTE_WRITE, 0, (void *)dirname);

   kevent(kq, &direvent, 1, NULL, 0, NULL);

   // Register interest in SIGINT with the queue.  The user data
   // is NULL, which is how we'll differentiate between
   // a directory-modification event and a SIGINT-received event.
   struct kevent sigevent;
   EV_SET (&sigevent, SIGINT, EVFILT_SIGNAL, EV_ADD | EV_ENABLE, 0, 0, NULL);
   // kqueue event handling happens after the legacy API, so make
   // sure it doesn eat the signal before the kqueue can see it.
   signal (SIGINT, SIG_IGN);

   // Register the signal event.
   kevent(kq, &sigevent, 1, NULL, 0, NULL);

   while (1) {
       // camp on kevent() until something interesting happens
       struct kevent change;
       if (kevent(kq, NULL, 0, &change, 1, NULL) == -1) { exit(1); }
       // The signal event has NULL in the user data.  Check for that first.
       if (change.udata == NULL) {
           break;
       } else {
        // udata is non-null, so it's the name of the directory
        printf ("%s\n", (char*)change.udata);
       }
   }
   close (kq);
   return 0;
}

详细信息可以在ch中找到。Mark Dalrymple的"Advanced Mac“中的16 (kqueue和FSEvents)。可以在*BSD文档中找到kqueue的其他信息。

或者使用FSEvents中的这个API (它主要是基于C的)。

代码语言:javascript
复制
FSEventStreamRef FSEventStreamCreate (CFAllocatorRef allocator,
                                  FSEventStreamCallback callback,
                                  FSEventStreamContext *context,
                                  CFArrayRef pathsToWatch,
                                  FSEventStreamEventId sinceWhen,
                                  CFTimeInterval latency,
                                  FSEventStreamCreateFlags flags);

使用纯C回调创建FSEvents事件流。

方法将此事件流附加到运行循环中。

代码语言:javascript
复制
void FSEventStreamScheduleWithRunLoop (FSEventStreamRef streamRef,
                                   CFRunLoopRef runLoop,
                                   CFStringRef runLoopMode);

是的,在这里您可能应该使用一行Obj-C来获取RunLoop句柄:使用-getCFRunLoop从NSRunLoop获取CFRunLoop

代码语言:javascript
复制
CFRunLoop* loopRef = [[NSRunLoop currentRunLoop] getCFRunLoop];

或者使用纯C调用

代码语言:javascript
复制
CFRunLoop* loopRef =  CFRunLoopGetCurrent();

开始事件流:

代码语言:javascript
复制
Boolean FSEventStreamStart (FSEventStreamRef streamRef);

使用以下命令停止事件流

代码语言:javascript
复制
void FSEventStreamStop (FSEventStreamRef streamRef);

然后使用以下命令从运行循环中取消对它的调度:

代码语言:javascript
复制
void FSEventStreamUnscheduleFromRunLoop (FSEventStreamRef streamRef,
                                     CFRunLoopRef runLoop,
                                     CFStringRef runLoopMode);

使流无效(清理):

代码语言:javascript
复制
void FSEventStreamInvalidate (FSEventStreamRef streamRef);

希望这篇文章能帮你入门。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11556545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档