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

时间:2013-06-23 17:43:00

标签: objective-c macos foundation xpc nsxpcconnection

interruptionHandler NSXPCConnection州块的文档:

  

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

然而,Daemons and Services Programming Guide州:

  

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

重新启动服务之前,其XPC连接已无效

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

1 个答案:

答案 0 :(得分:2)

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

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

模拟的内存压力警告水平应该足够了,以下是你的工作方式:

sudo memory_pressure -S -l warn

至关重要:

sudo memory_pressure -S -l critical

测试XPC服务时经常会错过这种情况。但是,建议XPC服务设计为无状态,因此在大多数情况下,如果您的服务已停止并且下次发送消息时可以通过launchd重新启动,则无关紧要。理想情况下,当您上次完成连接时,您的连接无效。

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