3

我正在学习 Mac App 开发,从命令行应用程序和 Core Foundation API 开始。我想要做的是在应用程序在终端中运行时监听文件系统事件。当用户退出时,它会干净地关闭流并退出。这是我所拥有的...

#include <CoreServices/CoreServices.h>
#include <stdio.h>

void eventCallback(FSEventStreamRef stream, void *callbackInfo, size_t numEvents, void *paths, FSEventStreamEventFlags flags[], FSEventStreamEventId eventId[]) {
    printf("Test");
}

int main(int argc, const char * argv[])
{
    CFStringRef mypath = CFSTR("/Path/to/folder");
    CFArrayRef paths = CFArrayCreate(NULL, (const void **)&mypath, 1, NULL);

    CFRunLoopRef loop = CFRunLoopGetMain();
    FSEventStreamRef stream = FSEventStreamCreate(NULL, eventCallback, NULL, paths, kFSEventStreamEventIdSinceNow, 3.0, kFSEventStreamCreateFlagNone);
    FSEventStreamScheduleWithRunLoop(stream, loop, kCFRunLoopDefaultMode);
    FSEventStreamStart(stream);
    bool done;

    # Somehow put main thread to sleep here...

    # On exit of application
    FSEventStreamStop(stream);
    FSEventStreamInvalidate(stream);
    FSEventStreamRelease(stream);

    return 0;
}

所以我已经确定使用主线程运行循环(或者可能是一个单独的线程)应该可以完成这项工作,但我不确定在等待事件时让线程进入睡眠状态的最佳方法。我对 Apple 的 API 不够熟悉,不知道该怎么做。

谢谢你的帮助!

4

1 回答 1

3
# Somehow put main thread to sleep here…
CFRunLoopRun();

你去吧。

CFRunLoopRun()为当前线程(在本例中为主线程)旋转运行循环。由于您已将 FS 事件流附加到主运行循环,因此您的 FS 事件将由此运行循环处理,因此将调用您的回调函数。运行循环将一直旋转直到您调用CFRunLoopStop()(如果您调用它)。

不过,您需要决定如何处理程序终止。Cocoa 应用程序可以使用方便的-[NSApplicationDelete willTerminate:]方法来执行清理操作。由于您没有使用 Cocoa,因此您必须自己动手,也许通过使用atexit(3)signal(3)和使用⌃C退出程序。

于 2013-08-23T05:20:27.463 回答