3

我的应用程序 (Cocoa) 包含一个特权帮助工具 (C),该工具使用 安装SMJobBless,模仿 Nathan de Vries 的SMJobBlessXPC 示例代码。它在尝试连接到其导出的 Mach XPC 连接时成功启动。到目前为止,一切都很好。

我不知道以后如何终止该过程。当我的应用程序终止时,辅助工具不再运行任何业务——事实上,它明确地不应该再运行了。不过,我一生都无法弄清楚如何退出它。

从处理程序调用exit(0)XPC 事件似乎没有效果,可能是因为exit终止当前线程的文档状态,而不是进程。我的main功能如下所示:

int main(int argc, const char * argv[])
{
    // setup a Mach XPC service so that we can receive communication from the app
    xpc_connection_t service = xpc_connection_create_mach_service("com.my.service.name", dispatch_get_main_queue(), XPC_CONNECTION_MACH_SERVICE_LISTENER);
    xpc_connection_set_event_handler(service, ^(xpc_object_t connection){
        handle_xpc_connection(connection);
    });

    xpc_connection_resume(service);

    dispatch_main();

    xpc_release(service);
    return 0;
}

我知道dispatch_main永远不会返回,所以这可能与它有关,但必须有一些方法可以让进程正常退出。我需要切换到使用CFRunLoop吗?

作为推论,我如何确保该过程不会过早终止?辅助工具或主应用程序都将准确地知道终止的正确时间。一旦作业开始,它会继续运行直到终止吗?我对 launchd 的生命周期管理有点模糊,而且它在launchd.plist(5).

4

0 回答 0