IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

Tuer tous les processus cree par un programme C++


Sujet :

Threads & Processus C++

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 20
    Points
    20
    Par défaut Tuer tous les processus cree par un programme C++
    Salut à tous,

    J'ai réalisé en C++ un launcher (sous Windows), qui lance un processus grâce à la fonction CreateProcess().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	// start the child process
    	if (CreateProcess(NULL,			// use cmdline
    		argv[1],					// cmdline
    		NULL,						// process handle inheritance
    		NULL,						// thread handle inheritance
    		FALSE,						// handle inheritance
    		0,							// creation flag
    		NULL,						// parent's environment
    		NULL,						// parent's starting directory
    		&si,						// STARTUPINFO
    		&pi) == FALSE)				// PROCESS_INFO
    	{
    		TRACEIT("CreateProcess failed (%d)", GetLastError());
    		return -1;
    	}
    Un WaitForSingleObject() sur le handle retourné me permet d'attendre la fin du processus lancé, et de passer à la suite du code. Si je tue le processus lancé, alors le launcher reprend la main, et continue son exécution. Par contre, si je tue le launcher, le processus lancé n'est pas tué.

    Existe t il un moyen afin que, si le launcher est tué (via le Gestionnaire de tâches), alors il tue tous les processus qu'il a lancé ?

    Merci.

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Citation Envoyé par inh40 Voir le message
    Existe t il un moyen afin que, si le launcher est tué (via le Gestionnaire de tâches), alors il tue tous les processus qu'il a lancé ?

    Merci.
    A chaque lancement de programme, garde le handle du processus lancé dans un tableau (et met ce tableau à jour si un programme est terminée avant le launcher).

    Pour remédier au problème du kill sur le launcher il faut gérer :

    - WM_CLOSE pour un programme GUI.
    - CTRL_CLOSE_EVENT pour un programme CUI (Console).

    Dans la gestion de cet événement il suffit de faire un TerminateProcess sur tous les handles présents dans le tableau.

    cf. Terminating a process (MSDN).

    P.S : Attention, TerminateProcess n'est pas vraiment clean...

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Hello,

    Citation Envoyé par inh40 Voir le message
    Par contre, si je tue le launcher, le processus lancé n'est pas tué.

    Existe t il un moyen afin que, si le launcher est tué (via le Gestionnaire de tâches), alors il tue tous les processus qu'il a lancé ?
    Avant de lancer quoique ce soit, affecte ton launcher a un nouveau job avec AssignProcessToJobObject:
    http://msdn2.microsoft.com/en-us/lib...49(VS.85).aspx

    De memoire, tu peux configurer le job pour que tous les process soient tues quand ton launcher meurt...

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    Dans mon launcher, j'ai mis ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool CSCI_XX_Tools::HandlerRoutine(DWORD action)
    {
    	if ((action == CTRL_CLOSE_EVENT) && (s_processHandle != NULL))
    	{
    		TerminateProcess(s_processHandle, 0);
    	}
    	return TRUE;
    }
    avec un SetConsoleCtrlHandler((PHANDLER_ROUTINE) HandlerRoutine, TRUE).

    Cependant, lorsque je tue mon launcher via le Gestionnaire des taches, il ne tue pas le processus lancé par ce launcher :/
    Le signal envoyé par le Gestionnaire des taches est il bien CTRL_CLOSE_EVENT ?

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par inh40 Voir le message
    Cependant, lorsque je tue mon launcher via le Gestionnaire des taches, il ne tue pas le processus lancé par ce launcher :/
    Le signal envoyé par le Gestionnaire des taches est il bien CTRL_CLOSE_EVENT ?
    Windows tue le programme que le gestionnaire des taches lui a demander de tuer, donc c'est normal qu'il n'en tue pas un autre. Il le tue : pan t'es mort. Il n'envoie aucun message, rien, fini. Il ne s'execute plus. Tu n'as aucun moyen raisonable de faire executer du code a toi juste avant d'etre tue.

    Je t'ai donne la seule alternative que je connaisse.

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    Bah comme ca c'est clair
    Je pensais qu'il était possible de masquer le signal, comme sous Unix.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Erreur, il est impossible de masquer un signal SIGKILL, contrairement à d'autres signaux comme SIGTERM.

    Et TerminateProcess() fait l'équivalent de SIGKILL.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/04/2015, 06h45
  2. Réponses: 3
    Dernier message: 08/11/2011, 16h32
  3. Réponses: 7
    Dernier message: 29/06/2008, 00h14
  4. Sélectionner tous les id renvoyés par une 1ère requête
    Par Prof Vince dans le forum Requêtes
    Réponses: 5
    Dernier message: 29/11/2003, 19h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo