当父应用程序仍在运行时杀死XPC

时间:2015-01-05 07:27:45

标签: kill nsxpcconnection

我的父应用程序使用帮助程序XPC来完成某项任务T1。 XPC服务使用NSXPCConnection实现。 一旦任务完成,我不需要这个XPC活着。因此,父进程在NSXPCConnection对象上调用invalidate。 但是,即使连接无效,XPC仍然存在。我可以看到它被列在Activity Monitor中。

当父应用程序仍在运行且不需要XPC活着时,如何终止此XPC?

2 个答案:

答案 0 :(得分:0)

XPC Agent的设计意味着长寿。 它们在根据.plist配置中的KeepAlive设置退出或崩溃时自动重新加载。

也许您可以注册为NSWorkspace事件的观察者:

[[NSWorkspace sharedWorkspace] notificationCenter];

请参阅: NSWorkspace 工作区通知在以下时间发布:

  • 启动并终止应用程序

然后,当您的父应用程序退出并在启动时重新启用它时,您可以禁用您的XPC服务。

答案 1 :(得分:0)

为了清楚起见,当父应用程序退出时,您的XPC进程将退出。我的确如此。你的问题是:如何在此之前杀死它?

这很简单:只需在调用完成处理程序后立即在XPC进程中调用exit(0),该处理程序将输出发送回父应用程序。上个月,我需要在一个项目中执行此操作,因为XPC进程使用的是Apple私有框架,并且退出它是我想要阻止某个不受欢迎和无法解释的唯一方法(因为我有没有关于私人框架的文件)副作用。

然而,在退出这个XPC进程后,我发现,奇怪的是,它继续运行了几毫秒,如果我的父应用程序同时打开另一个连接到同一个XPC服务,那注定的XPC进程将接受新的在杀死自己之前连接,让父应用程序挂起。我实际上已经看过几次了。

所以,一个后续问题是:你是否应该因为你想变得好而杀了它?我认为答案是没有,根据以下引用来自Apple的Daemons and Services Programming Guide > Creating XPC Services

  

XPC服务由launchd管理,按需启动它们,   如果它们崩溃则重新启动它们并终止它们(通过发送SIGKILL)   当他们闲着时。

总结:完成后只需使连接无效,让launchd担心查杀。另外,不要屏住呼吸。我的应用程序运行了两个小时,而XPC进程,最后一次连接在两小时前关闭,仍在运行。