Durchführen Äquivalent von „Kill Process Tree“ in C ++ auf Fenstern
Frage
Wir haben eine C ++ Aufgabe, einen neuen Prozess Gabel wird. Dieser Prozess kann wiederum mehrere Kindprozesse haben. Wenn die Aufgabe vorbei an einer vorgegebenen Zeit ausgeführt wird, wollen wir, dass die gegabelten Prozess töten.
Aber wir wollen nicht, um die Prozesse verwaisen sie hervorgebracht hat. Wir wollen, dass sie alle sterben. Ich habe Process Explorer verwendet und es hat eine „Kill Process Tree“ Option, ähnlich dem Windows Task-Managers auf „Prozess beenden Tree“, so vermute ich, / vorausgesetzt, es gibt eine öffentliche API, dies zu tun ist. Hat jemand dies getan, oder Know eines Hinweises auf eine öffentliche API, die das?
Lösung
Sie möchten vielleicht die „Jobs API“ betrachten. CreateJobObject
und Freunde. Sie können Kinder Prozesse erzwingen im Job zu bleiben, durch entsprechendes Attribut festlegen. Dann können Sie TerminateJobObject
rufen, wann immer Sie wollen.
Zur Verdeutlichung:. Das ist nicht das, was die Task-Manager funktioniert
Andere Tipps
Ich schlage vor, gehe das Auftragsobjekt Route, wie oben angegeben, wird es die zuverlässigste sein.
Wenn Sie nicht das Auftragsobjekt Weg gehen können, können Sie die TOOLHELP API verwenden, um übergeordnete Prozess-IDs zu erhalten und bauen Sie den Baum auf diese Weise. Seien Sie aber vorsichtig, da Windows nicht eine starke Eltern / Kind-Beziehung hat, und es ist möglich, PIDs recycelt werden. Sie können GetProcessTimes
verwenden, um die Erstellungszeit des Prozesses abfragen und prüfen, ob es älter ist als das Kind. Wenn ein Zwischenprozess im Baum beendet ist, werden Sie nicht in der Lage sein, den Baum weiter zu gehen.
// Error handling removed for brevity
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
Process32First(snapshot, &process);
do
{
// process.th32ProcessId is the PID.
// process.th32ParentProcessID is the parent PID.
} while (Process32Next(snapshot, &process));
Es gibt eine Funktion Win32 namens TerminateProcess () . Es sollte die Arbeit für Sie tun.
Als Alternative habe ich den taskkill Befehl gefunden für Dinge wie diese nützlich sein.
über die Befehlszeile:
taskkill /F /T /IM program.exe
Code:
system("taskkill /F /T /IM program.exe");
andere Schalter (gerade von taskkill /?):
TASKKILL [/S system [/U username [/P [password]]]] { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T] Description: This command line tool can be used to end one or more processes. Processes can be killed by the process id or image name. Parameter List: /S system Specifies the remote system to connect to. /U [domain\]user Specifies the user context under which the command should execute. /P [password] Specifies the password for the given user context. Prompts for input if omitted. /F Specifies to forcefully terminate process(es). /FI filter Displays a set of tasks that match a given criteria specified by the filter. /PID process id Specifies the PID of the process that has to be terminated. /IM image name Specifies the image name of the process that has to be terminated. Wildcard '*' can be used to specify all image names. /T Tree kill: terminates the specified process and any child processes which were started by it. /? Displays this help/usage.
-Johannes
Sie möchten die Prozess-ID für den Prozess finden Sie, dann „zu Fuß den Baum“ seiner Kinder (und ihre Kinder, und so weiter ...), beachten Sie ihre PIDs, und dann töten alle Prozesse töten wollen schön und schnell.
Sie können auch WMI verwenden, Routenplanung Sie eine Klasse erstellen können, die Aufgaben zu erfüllen.
Se dieses "Wo finde ich die WMI-Dokumentation finden?"
und Die WMI-COM-Bibliothek
und WMI C ++ Anwendungsbeispiele