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

问题描述 投票:1回答:2

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

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

kill nsxpcconnection
2个回答
0
投票

XPC代理商的设计意味着长寿。它们在基于.plist配置中的KeepAlive设置退出或崩溃时自动重新加载。

也许您可以注册为NSWorkspace事件的Observer:

[[NSWorkspace sharedWorkspace] notificationCenter];

请参阅:NSWorkspace工作区通知在以下情况下发布:

  • 应用程序启动和终止

然后,当您的Parent应用程序退出并启动时,您可以禁用您的XPC服务。


0
投票

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.