Process group

Résolu
cs_User8 Messages postés 30 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 13 novembre 2012 - 30 oct. 2008 à 11:41
cs_User8 Messages postés 30 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 13 novembre 2012 - 30 oct. 2008 à 15:50
Bonjour tout le monde,


Je rencontre actuellement un problème pour la suppression de processus.

Je serai donc fort intéressé par un petit coup de main.


Le but étant de supprimer tous les processus fils d'un processus que
j'ai lancé.Ctrl-C dans la console fait çà très bien mais la console
n'est pas forcement affichée et je veux que la suppression se passe par
un simple clic sur un bouton.


A la base je suis parti sur un CreateProcess tué par un Terminateprocess mais cela ne supprime que le processus père.

J'ai donc changé de stratégie. je crée un process avec createprocess+le
flag CREATE_NEW_PROCESS_GROUP pour que tous les process fils
appartiennent au mem groupe. Ensuite pour supprimer tout ça, je fais
une GenerateConsoleCtrlEvent (CTRL_C_EVENT ou CTRL_BREAK_EVENT) sur le
ProcessId du père. En toute logique, le process père et tous ses fils
devraient etre tués, non? Aprés la commande, toute la petite bande de
processus est toujours là....même le pere. Je comprend pas pourquoi.


Voici les deux fct utilisées:

-CreateProcess(nil,cmd,nil,nil,false,CREATE_NEW_PROCESS_GROUP, nil, nil, startinfo, proc_info)

-GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,proc_info.dwProcessId);


Une idée?

pour info, un SysErrorMessage (GetLastError) aprés mon GenerateConsoleCtrlEvent, me retourne "Descripteur non valide"


Merci d'avance.

1 réponse

cs_User8 Messages postés 30 Date d'inscription jeudi 24 juillet 2008 Statut Membre Dernière intervention 13 novembre 2012
30 oct. 2008 à 15:50
bon ben finalement, j'ai développé une procédure qui tue un par un le processus et tous ses descendants. La voici:


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

  terminateprocess(processhandle, 4);

End;
3
Rejoignez-nous