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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    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
    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 confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 averti
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    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 confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 averti
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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