当 launchd 终止进程时是不是调用 XPC 中断处理程序?

Posted

技术标签:

【中文标题】当 launchd 终止进程时是不是调用 XPC 中断处理程序?【英文标题】:Is an XPC interruption handler called when launchd kills the process?当 launchd 终止进程时是否调用 XPC 中断处理程序? 【发布时间】:2013-06-23 17:42:59 【问题描述】:

NSXPCConnectioninterruptionHandler 块的文档指出:

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

但是,Daemons and Services Programming Guide 声明:

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

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

【问题讨论】:

你发现它的作用了吗?手动发送 SIGKILL 会调用中断处理程序。 【参考方案1】:

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

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

内存压力的模拟警告级别应该足够了,您可以这样做:

sudo memory_pressure -S -l warn

对于关键:

sudo memory_pressure -S -l critical

测试 XPC 服务时经常会忽略此条件。但是,建议 XPC 服务设计为无状态的,因此在大多数情况下,您的服务是否停止并可以在您下次发送消息时由 launchd 重新启动并不重要。理想情况下,您在最后一次完成连接时使连接无效。

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

【讨论】:

以上是关于当 launchd 终止进程时是不是调用 XPC 中断处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

使用 XPC 创建守护进程/UI 连接

在 Mac 上的“终端”中使用 launchd 管理脚本

XPC 没有为 XPC 服务创建任何进程

即使在异常终止时,如何确保调用 UnhookWindowsHookEx?

进程-

[APUE]进程控制(中)