Mac OS X: самый быстрый способ убить / выйти из всего дерева процессов из приложения Cocoa
Я знаю, что есть много вопросов и ответов по этому поводу, но я ищу эффективное и надежное решение. Мне нужно убить процесс и все его дочерние процессы из приложения Cocoa. Я получил идентификатор процесса, и то, что я собираюсь закодировать, - это выполнить команду kill так
kill -- -<parent PID>
Из моего приложения ... но мне это кажется ужасно банальным и жестоким. Разве нет лучшего решения? Carbon'S KillProcess () и его друзья-менеджеры процессов, похоже, не очень помогают, если я не создам сам процесс представления дерева. Я что-то упустил?
У меня также есть код для отправки события Quit Apple, основанного на PID. Было бы еще лучше, если бы можно было отправить это каждому процессу в дереве, определенном родительским процессом, снизу вверх. Но это только приятно иметь. Ответ на первый вопрос получает "точку".
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" );