我的应用程序 (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)
.