Question

Nous avons une tâche C ++ qui va déclencher un nouveau processus. Ce processus peut à son tour avoir plusieurs processus enfants. Si la tâche dépasse le temps imparti, nous voudrons supprimer ce processus.

Cependant, nous ne voulons pas rendre orphelins les processus qu’il a engendrés. Nous voulons qu'ils meurent tous. J'ai utilisé Process Explorer et il possède un "Kill Process Tree". Une option similaire à l'option "Arborescence de processus de fin" du gestionnaire de tâches de Windows, donc je suppose / suppose qu'il existe une API publique pour le faire. Quelqu'un a-t-il fait cela ou a-t-il eu connaissance d'une référence à une API publique qui le fait?

Était-ce utile?

La solution

Vous voudrez peut-être prendre en compte l'option "Jobs API". CreateJobObject et amis. Vous pouvez imposer aux processus enfants de rester dans le Job en définissant l'attribut approprié. Vous pouvez ensuite appeler TerminateJobObject à tout moment.

Clarification: ce n'est pas ce que fait le gestionnaire de tâches.

Autres conseils

Je suggère de suivre la route des objets de travail, comme indiqué ci-dessus, ce sera le plus fiable.

Si vous ne pouvez pas suivre la route des objets de travail, vous pouvez utiliser l’API toolhelp pour obtenir les ID de processus parents et créer l’arborescence de cette façon. Soyez prudent cependant, car Windows n'a pas de relation parent / enfant forte et il est possible que les PID soient recyclés. Vous pouvez utiliser GetProcessTimes pour interroger l'heure de création du processus et vérifier qu'il est plus ancien que l'enfant. Si un processus intermédiaire dans l'arborescence est terminé, vous ne pourrez plus parcourir l'arborescence.

// 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));

Il existe une fonction Win32 appelée TerminateProcess () . Il devrait faire le travail pour vous.

Sinon, j'ai trouvé la commande taskkill utile pour des choses comme celle-ci.

à partir de la ligne de commande:

taskkill /F /T /IM program.exe

à partir du code:

system("taskkill /F /T /IM program.exe");

autres commutateurs (directement à partir de 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.

-John

Vous voulez trouver l'ID du processus que vous souhaitez supprimer, puis "parcourir l'arborescence". de ses enfants (et de leurs enfants, etc.), notez leurs pids, puis tuez tous les processus rapidement et gentiment.

Vous pouvez également utiliser WMI, vous pouvez créer une classe pour planifier les itinéraires.
Voir cette "Où puis-je trouver la documentation WMI? & ;
et la bibliothèque WMI COM
et Exemples d'application WMI C ++

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top