Вызывается ли обработчик прерывания 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 (читай: сообщение обрабатывается и / или блок ответа не вызывался).