2015-01-05 2 views
1

Мое родительское приложение использует хелпер XPC для достижения некоторой задачи T1. Служба XPC реализована с использованием NSXPCConnection. Как только задача будет завершена, мне не нужен этот XPC, чтобы быть живым. Следовательно, родительский процесс вызывает недействительность для объекта NSXPCConnection. Но XPC все еще жив, даже если соединение недействительно. Я вижу, что это входит в Activity Monitor.Убить XPC, когда родительское приложение все еще запущено

Как убить этот XPC, когда родительское приложение все еще работает и не требует, чтобы XPC был в живых?

ответ

0

XPC Агенты по проекту предназначены для длительного проживания. Они автоматически перезагружаются при выходе из строя или сбое на основе их настроек KeepAlive в конфигурации .plist.

Может быть, вы можете зарегистрироваться в качестве наблюдателя событий NSWorkspace:

[[NSWorkspace sharedWorkspace] notificationCenter]; 

см: NSWorkspace уведомления Workspace размещены в следующих случаях:

  • приложения запускаются и прекращаются

Затем вы можете отключить службу XPC. Когда приложение «Родитель» завершает работу и повторно запускает его при запуске.

0

Чтобы быть чистым, процесс XPC прекратится, когда родительское приложение завершит работу. По крайней мере, моя. Ваш вопрос: как его убить до этого?

Это просто: просто позвоните exit(0) в свой процесс XPC сразу же после того, как он вызывает обработчик завершения, который отправляет результат обратно в родительское приложение. I необходимо было сделать, чтобы сделать это в прошлом месяце, потому что в процессе XPC была использована частная инфраструктура Apple, и выход из нее был единственным способом, которым я мог бы остановиться, чтобы остановить некоторые нежелательные и необъяснимые (поскольку у меня нет документации на частном рамочный) побочный эффект.

Однако, после выхода из этого процесса XPC, я обнаружил, что, как это ни странно, он продолжал работать в течение нескольких миллисекунд, и если мое родительское приложение открыло другое соединение с этой же службой XPC, тем временем, обреченный XPC-процесс будет принимать новое соединение непосредственно перед убийством, оставив родительское приложение висящим. Я на самом деле видел это несколько раз.

Итак, следующий вопрос: Должен ли вы убить его только потому, что хотите быть приятным? Я думаю, что ответ нет, в соответствии со следующей цитатой из Daemons and Services Programming Guide > Creating XPC Services

XPC услуг компании Apple управляет запуском программ, который запускает их по требованию, перезапускает их, если они терпят крах, и прекращает их (путем отправки SIGKILL) , когда они простаивают.

Подводя итог: просто аннулируйте свои соединения, когда это будет сделано, и пусть начнет беспокоиться об убийстве. Кроме того, не задерживайте дыхание. У меня было приложение, работающее в течение последних двух часов, и процесс XPC, последнее соединение, закрытое два часа назад, все еще работает.