Mac OS X: самый быстрый способ убить / выйти из всего дерева процессов из приложения Cocoa


Я знаю, что есть много вопросов и ответов по этому поводу, но я ищу эффективное и надежное решение. Мне нужно убить процесс и все его дочерние процессы из приложения Cocoa. Я получил идентификатор процесса, и то, что я собираюсь закодировать, - это выполнить команду kill так

kill -- -<parent PID>

Из моего приложения ... но мне это кажется ужасно банальным и жестоким. Разве нет лучшего решения? Carbon'S KillProcess () и его друзья-менеджеры процессов, похоже, не очень помогают, если я не создам сам процесс представления дерева. Я что-то упустил?

У меня также есть код для отправки события Quit Apple, основанного на PID. Было бы еще лучше, если бы можно было отправить это каждому процессу в дереве, определенном родительским процессом, снизу вверх. Но это только приятно иметь. Ответ на первый вопрос получает "точку".

2 4

2 ответа:

Вы можете просто использовать killpg, чтобы завершить процесс и все в его группе:

#include <signal.h>
#include <unistd.h>

/* ... */

killpg(getpgid(pid), SIGTERM);

Правильная проверка ошибок должна быть сделана, конечно, но вы должны получить суть. Смотрите справочные страницы kill(2) и killpg(2) для получения дополнительной информации.

В последний раз, когда я изучал это (что было несколько лет назад, но я не думаю, что многое изменилось), лучшим решением, которое я нашел, было просто вызвать команду System kill.

system( "ps axwww | grep -i CoreServices/Dock.app/Contents/MacOS/Dock | grep -v grep | awk '{print $1}' | xargs kill -3" );