我正在学习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,知道该怎么做。
感谢您的帮助!
答案 0 :(得分:3)
# Somehow put main thread to sleep here…
CFRunLoopRun();
你去。
CFRunLoopRun()
旋转当前线程的运行循环(在本例中为主线程)。由于您已将FS事件流附加到主运行循环,因此您的FS事件将由此运行循环处理,因此将调用您的回调函数。运行循环将继续旋转,直到您调用CFRunLoopStop()
(如果您调用它)。
但是,您需要决定如何处理程序终止。 Cocoa应用程序可以使用方便的-[NSApplicationDelete willTerminate:]
方法来执行清理操作。由于你没有使用Cocoa,你必须使用atexit(3)
或signal(3)
并使用 ^ C 退出程序。