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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top