在launchd杀死进程时调用XPC中断处理程序?

ind*_*gie 7 macos xpc objective-c foundation nsxpcconnection

interruptionHandler块的文件NSXPCConnection:

如果远程进程退出或崩溃,则调用中断处理程序.

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

XPC服务由launchd管理,它按需启动它们,如果它们崩溃则重新启动它们,并在它们空闲时终止它们(通过发送SIGKILL).这对使用该服务的应用程序是透明的,除了在处理需要响应的消息时崩溃的服务的情况.在这种情况下,应用程序可以看到,在launchd重新启动服务之前,其XPC连接已无效

如果XPC进程因空闲而被杀死,我会收到回调interruptionHandler吗?或者,当应用程序在处理邮件时崩溃时,我是否只会收到回调?我问,因为这个测试用例似乎无法模拟.不幸的是,XPC服务生命周期是一个非常黑的盒子.

amc*_*mcc 2

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

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

模拟内存压力警告级别应该足够了,具体方法如下:

sudo memory_pressure -S -l warn
Run Code Online (Sandbox Code Playgroud)

对于关键的:

sudo memory_pressure -S -l critical
Run Code Online (Sandbox Code Playgroud)

测试 XPC 服务时经常会忽略这种情况。不过,建议将 XPC 服务设计为无状态,因此在大多数情况下,服务是否停止并不重要,并且可以在下次发送消息时通过 launchd 重新启动。理想情况下,您在上次完成连接时使连接无效。

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