Mac OS X: самый быстрый способ убить / выйти из всего дерева процессов из приложения Какао - PullRequest
4 голосов
/ 15 июня 2009

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

kill -- -<parent PID>

из моего приложения ... но мне это кажется ужасно хакерским и жестоким. Нет ли лучшего решения? KillProcess () от Carbon и его друзья из Process Manager вряд ли помогут, если я сам не создам представление дерева процессов. Я что-то упустил?

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

Ответы [ 2 ]

8 голосов
/ 15 июня 2009

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

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

/* ... */

killpg(getpgid(pid), SIGTERM);

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

0 голосов
/ 15 июня 2009

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

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