是在launchd终止进程时调用的XPC中断处理程序



NSXPCConnectioninterruptionHandler块的文档状态:

在远程进程退出或崩溃时调用的中断处理程序。

但是,守护程序和服务编程指南指出:

XPC服务由launchd管理,launchd根据需要启动它们,在它们崩溃时重新启动它们,并在它们空闲时终止它们(通过发送SIGKILL)。这对于使用服务的应用程序是透明的,除非服务在处理需要响应的消息时崩溃。在这种情况下,应用程序可以看到它的XPC连接已经失效,直到launchd 重新启动服务

如果XPC进程因空闲而被终止,我的interruptionHandler中会得到回调吗?还是只有当应用程序在处理消息时崩溃时,我才会得到回调?我这么问是因为这个测试用例似乎不可能模拟。不幸的是,XPC服务生命周期是一个非常黑的盒子。

是的,如果launchd停止空闲服务,将调用中断处理程序。

这可以通过利用launchd对内存压力的自然反应来模拟:停止所有空闲的launchd启动的服务来帮助缓解问题。

模拟的内存压力警告级别应该足够了,以下是您的操作方法:

sudo memory_pressure -S -l warn

对于关键:

sudo memory_pressure -S -l critical

在测试XPC服务时,经常会忽略此条件。但是,建议将XPC服务设计为无状态的,因此在大多数情况下,您的服务是否已停止,并可以在下次发送消息时通过launchd重新启动,这应该无关紧要。理想情况下,当你最后一次使用它时,你会使连接无效

如果存在正在进行的XPC事务(读取:正在处理消息和/或尚未调用回复块),Launchd将不会停止具有上述条件的XPC服务。

最新更新