Вызывается ли обработчик прерывания XPC, когда launchd убивает процесс?

Документация для interruptionHandler блок из NSXPCConnection состояния:

Обработчик прерываний, который вызывается, если удаленный процесс завершается или завершается сбоем.

Однако в Руководстве по программированию демонов и сервисов говорится:

Службы XPC управляются launchd, который запускает их по требованию, перезапускает их в случае сбоя и завершает их (отправляя SIGKILL), когда они простаивают. Это прозрачно для приложения, использующего службу, за исключением случая сбоя службы при обработке сообщения, требующего ответа. В этом случае приложение может видеть, что его соединение XPC стало недействительным, пока служба не будет перезапущена launchd

Если процесс XPC будет убит из-за простоя, получу ли я обратный вызов в моем interruptionHandler? Или я получу обратный вызов, только когда приложение завершит работу во время обработки сообщения? Я спрашиваю, потому что этот контрольный пример кажется невозможным для моделирования. Жизненный цикл службы XPC, к сожалению, очень чёрный.

1 ответ

Да, обработчик прерывания будет вызван, если launchd останавливает службу из-за простоя.

Это можно смоделировать, используя естественную реакцию, которая запускается на нагрузку на память: останавливая все запущенные запущенные службы, которые простаивают, чтобы помочь решить проблему.

Имитируемого уровня предупреждения о нагрузке на память должно быть достаточно, вот как вы это делаете:

sudo memory_pressure -S -l warn

И для критических:

sudo memory_pressure -S -l critical

Это условие часто пропускается при тестировании XPC Services. Однако рекомендуется, чтобы службы XPC были разработаны без сохранения состояния, поэтому в большинстве случаев не должно иметь значения, остановлена ​​ли ваша служба, и ее можно перезапустить, запустив ее при следующей отправке сообщения. И в идеале вы сделали недействительным соединение, когда вы в последний раз с ним покончили.

Launchd не остановит службу XPC с указанными выше условиями, если есть текущая транзакция XPC (читай: сообщение обрабатывается и / или блок ответа не вызывался).

Другие вопросы по тегам