Mac OS X: Schnellster Weg zu töten / quit einen gesamten Prozessbaum von innerhalb einer Cocoa-Anwendung
-
13-09-2019 - |
Frage
Ich weiß, dass es viele Fragen und Antworten zu diesem, aber ich bin für eine effiziente und robuste Lösung. Ich brauche einen Prozess zu beenden und alle ist es Child-Prozesse innerhalb einer Cocoa-Anwendung. Ich habe den Prozess-ID und das, was ich bin zu Code ist den Kill-Befehl wie so
auszuführenkill -- -<parent PID>
aus meinem app ... aber das scheint schrecklich hacky und brutal zu mir. Gibt es nicht eine bessere Lösung? Carbon Killprocess () und seine Process Manager Freunde scheinen nicht viel helfen, wenn ich einen Prozess Baumdarstellung selbst bauen. Bin ich etwas fehlt?
Ich habe auch einige Code die Quit Apple-Ereignis basierend auf PID zu senden. Es wäre noch schöner zu können, dass für jeden Prozess in dem Baum von einem übergeordneten Prozess, von unten nach oben definiert senden. Aber das ist nur ein nice-to-have. Eine Antwort auf die erste Frage bekommt den „Punkt“.
Lösung
Sie können einfach verwenden killpg den Prozess und alles in seiner Gruppe zu beenden:
#include <signal.h>
#include <unistd.h>
/* ... */
killpg(getpgid(pid), SIGTERM);
Die richtige Fehlerprüfung sollte natürlich getan werden, aber Sie sollten den Kern erhalten. Siehe den Manpages kill(2)
und killpg(2)
für weitere Informationen.
Andere Tipps
Das letzte Mal, dass ich in diese sah (die vor ein paar Jahren war, aber ich glaube nicht viel geändert hat) die beste Lösung, die ich fand, war nur das System Kill-Befehl aufzurufen.
system( "ps axwww | grep -i CoreServices/Dock.app/Contents/MacOS/Dock | grep -v grep | awk '{print $1}' | xargs kill -3" );