Tuer tous les descendants d'un process

cs_User8 Messages postés 30 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 13 novembre 2012 - 18 août 2009 à 09:50
cs_User8 Messages postés 30 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 13 novembre 2012 - 24 août 2009 à 09:31
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

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
22 août 2009 à 15:24
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 !
0
cs_User8 Messages postés 30 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 13 novembre 2012
24 août 2009 à 09:31
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;
0
Rejoignez-nous