我的应用程序(Cocoa)包含一个使用SMJobBless
安装的特权帮助工具(C),模仿Nathan de Vries的SMJobBlessXPC sample code。它成功启动了与其导出的Mach XPC连接的连接尝试。到目前为止一切都很好。
我无法弄清楚的是如何在以后终止该过程。当我的应用程序终止时,帮助工具不再运行业务 - 实际上,显式不应该再次运行。但是,我无法弄清楚如何退出它。
从处理程序中为XPC事件调用exit(0)
似乎没有任何效果,可能是因为文档声明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)
之外的文档记录不完善(我能找到)。