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

C Discussion :

Tuer processus père et enfant


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut Tuer processus père et enfant
    Bonjour,

    J'ai besoin de tuer un processus (ainsi que ses éventuels enfants) dont je connais seulement son nom.
    Comment faire ?

    J'ai penser à créer un process qui utiliserait la commande "tasskill.exe" mais ceci ne semble pas fonctionner correctement.
    Auriez-vous des idées ?
    Merci pour votre aide.

    Voici le code que j'utilise :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    int TuerProcess(char* Process)
    {
        STARTUPINFO si;         /* Requis par CreateProcess */
        PROCESS_INFORMATION pi; /* Requis par CreateProcess */
        LPTSTR szCmdline;
        char* CmdTuerProcess = malloc (sizeof (*CmdTuerProcess));
     
        /* La structure si est utilisée en entrée donc elle doit être impérativement initialisée    */
        ZeroMemory(&si, sizeof(si));
     
        /* Pas la peine d'initialiser la structure pi car elle sera écrite et non lue              */
     
        //Initialisation du chemin du package d'installation
        sprintf(CmdTuerProcess, "%s%s%s", "\"taskkill /F /IM ", Process, " /T\"");
        szCmdline = TEXT(CmdTuerProcess);
     
        if((int) DebugMode==WINLOG_LEVEL_09)
        {
            INFO2("CmdTuerProcess=%s", szCmdline);
        }
     
     
        INFO2("CmdTuerProcess=%s", szCmdline);
     
        //Initialisation du process d'installation
        if (CreateProcess( szCmdline,       /* Nom de l'exécutable                    */
                           NULL,      /* Arguments de la ligne de commande                             */
                           NULL,      /* Attributs de sécurité du nouveau processus (processus fils)   */
                           NULL,      /* Attributs de sécurité du thread principal                     */
                           FALSE,     /* Le processus fils héritera t-il des handles du processus père */
                           0,         /* Flags de création                                             */
                           NULL,      /* Variables d'environnement                                     */
                           NULL,      /* Répertoire courant                                            */
                           &si,       /* Paramètres d'initialisation du processus                      */
                           &pi        /* Informations sur le processus                                 */ )!=0)
        {
            WaitForSingleObject(pi.hProcess, INFINITE);      /* Attendre la fin du processus           */
     
            CloseHandle(pi.hProcess); /* Fermer le handle vers le processus                            */
            CloseHandle(pi.hThread);  /* Fermer le handle vers le thread principal du processus        */
     
            free(CmdTuerProcess);
            return(TRUE);
        }
        else
        {
            WinLogW(WinLog_Error, WINLOG_LEVEL_09, L"Code Erreur CreateProcess = %d", GetLastError());
            if((int) DebugMode==9)
            {
                ERROR2("Process=%s", Process);
            }
     
            free(CmdTuerProcess);
            return(FALSE);
        }
    }
    Le code d'erreur qui est retourné est "123" soit "The filename, directory name, or volume label syntax is incorrect. alors même que le process existe bien dans la liste des processus qui tournent.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par défaut
    Il faut préciser dans ces cas-là que tu travailles sous Windows. Sous UNIX et Linux, il y a pkill et killall qui fonctionnent bien pour cela, aussi. Et un signal peut se propager du père à ses fils…

    Dans ton cas, ce n'est probablement pas le processus qu'il n'arrive pas à trouver, mais la commande taskill elle-même. Et encore, pour cela, il faut que ce soit un vrai exécutable sur le disque et pas une commande interne du « shell » utilisé.

    Le mieux que tu aies à faire dans ce cas est d'utiliser system() même si on t'apprend en général à éviter d'y recourir. C'est à la fois plus simple et plus adapté.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    oups désolé, oui c'est sous Windows.
    Sinon OK pour utiliser la commande system() mais comment je connais le retour de celle-ci ?
    J'ai besoin de savoir si l'arrêt du process s'est correctement déroulé ou non.
    Un "GetLastError()" fonctionne aussi pour la commande "system()" ?
    En fait, il faut que mon programme fonctionne sur tous les OS Windows de type NT (XP, Vista, Seven, 2003, 2008).

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Je viens de modifier et donc simplifier le code et là c'est pire
    Le programme plante complètement sur la commande "system()"

    J'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        sprintf(CmdTuerProcess, "\"taskkill.exe /F /T /IM %s\"", Process);
        szCmdline = TEXT(CmdTuerProcess);
     
        system(szCmdline);
    Là je suis perdu.
    au moins avec la création d'un process, ça faisait une erreur au lancement du process mais ça ne plantait pas tout le prog

    Sinon, il y a peut-être moyen de tuer un process dont on connait le nom sans passer pas le taskkill.exe de Windows ?

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par défaut
    Non, désolé, GetLastError() ne fonctionnera probablement pas ici. Par contre, system() te renverra quand même le code de retour du processus.

    Essaie déjà d'enlever les guillemets supplémentaires que tu as ajouté avec « \" ».

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Merci
    En fait, j'ai fait mieux, j'ai abandonner l'idée d'utiliser taskkiller et ai donc chercher à récupérer le PID du processus pour le tuer.
    Chose que j'ai faite.
    Donc maintenant je récupère correctement le PID du processus, et ensuite je le tue avec TerminateProcess()

    Par contre maintenant le soucis, c'est que semble correctement être tué mais il me reste un module ".DLL" qui reste chargé mais qui lui est lancé par le process "Explorer.exe", il me faut donc tuer ce module ".DLL" mais ne surtout pas tuer le process "Explorer.exe"
    Y-a-t-il un moyen de le faire, si oui comment ? ce module a-t-il un PID qu'il faut récupérer ? etc...
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Processus père attend processus fils
    Par prgasp77 dans le forum Administration système
    Réponses: 12
    Dernier message: 10/09/2009, 15h00
  2. Réponses: 2
    Dernier message: 17/12/2008, 13h14
  3. Process.start avec un processus père
    Par DranDane dans le forum C#
    Réponses: 2
    Dernier message: 24/09/2008, 14h02
  4. Réponses: 8
    Dernier message: 09/11/2006, 14h01
  5. Tuer processus fils
    Par lornak dans le forum POSIX
    Réponses: 7
    Dernier message: 29/05/2006, 10h00

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