Tuer tous les descendants d'un process

Signaler
Messages postés
30
Date d'inscription
jeudi 24 juillet 2008
Statut
Membre
Dernière intervention
13 novembre 2012
-
Messages postés
30
Date d'inscription
jeudi 24 juillet 2008
Statut
Membre
Dernière intervention
13 novembre 2012
-
Bonjour,

J'ai un bout de code où je lance un process A via createprocess.
Ce process A peut appeler différent process fils qui eux même peuvent lancer des process fils...

Existe-t-il un moyen simple pour stopper(killer) le process A et par la même occasion tous ses descendants? TerminateProcess tue le process A mais pas les descendants. j'ai une méthode qui liste récursivement les descendants puis vient les tuer un par un. N'y a t il pas de méthode plus simple et surtout moins risqué? Peut on utiliser la fenêtre par exemple?

Merci d'avance pour votre aide

2 réponses

Messages postés
3792
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
Je pense que la méthode qui liste récursivement les descendants est bien suffisante, surtout qu'il n'y aura pas tant de processus à killer. Mais pense à tuer du plus jeune (le plus recemment créé) au plus ancien, sinon des problèmes peuvent survenir.

Cordialement, Bacterius !
Messages postés
30
Date d'inscription
jeudi 24 juillet 2008
Statut
Membre
Dernière intervention
13 novembre 2012

Merci Bacterius!
Je tue mes processus en partant des descendants les plus bas dans l'arbre et je remonte jusqu'au processus pere.
Voila la source:
procedure killAllProcessesFrom(procId : DWORD);
var
  SnapShot: Cardinal;
  ProcessEntry: TProcessEntry32;
  processhandle : thandle;
begin
  //Création de "l'instantané"
  SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  //En cas d'erreur on sort
  If SnapShot = 0 then Exit;

  ProcessEntry.dwSize := SizeOf(ProcessEntry);

  //On liste les processus
  If Process32First(SnapShot, ProcessEntry) then
  begin
    Repeat

    //si le processus courant est le parent, on descend dans l'arbre
    if ProcessEntry.th32ParentProcessID = procId
    then killAllProcessesFrom(ProcessEntry.th32ProcessID)

    until not Process32Next(SnapShot, ProcessEntry)
  end;

  //Libération de l'instantané
  CloseHandle(SnapShot);

  //Suppression du process courant
  processhandle := openprocess(PROCESS_TERMINATE, FALSE, procID);
  if processhandle<>0 then terminateprocess(processhandle,0);
End;