OSX命令行C应用程序中的线程管理

时间:2013-08-23 04:24:11

标签: c multithreading macos command-line core-foundation

我正在学习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,知道该怎么做。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

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

你去。

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

但是,您需要决定如何处理程序终止。 Cocoa应用程序可以使用方便的-[NSApplicationDelete willTerminate:]方法来执行清理操作。由于你没有使用Cocoa,你必须使用atexit(3)signal(3)并使用 ^ C 退出程序。