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

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

  7. #7
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 18
    Par défaut
    Bonjour,
    Si tu connais le nom du module DLL généré, ainsi que son chemin, tu peux toujours essayer system ("del chemin\fichier.dll");

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 500
    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 500
    Par défaut
    Citation Envoyé par Korben-Dallas Voir le message
    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"
    Quel est ce module ? Il est peut-être normal qu'il soit toujours en vie s'il est partagé par différents processus.

  9. #9
    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
    juju666 : Il est impossible d'utiliser cette commande de suppression puisque le module est chargé en mémoire.

    Obsidian : En fait, le but de mon programme est de désinstaller à la warrior une appli, ce module fait justement parti de cette appli. Ce n'est pas un module partagé pour tout le monde.
    J'ai bien tenté en utilisant les librairies Microsoft mais ai bcp de mal à les faire fonctionner.

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    int TuerModule(char* Module)
    {
    //    STARTUPINFO si;         /* Requis par CreateProcess */
    //    PROCESS_INFORMATION pi; /* Requis par CreateProcess */
     
        int hModuleRechercher;    // Handle sur le process à tuer
        HMODULE phModule;
     
        DWORD Erreur;
     
        const DWORD dwBufferSize = 1024;
        WCHAR lpBuffer[dwBufferSize];
     
     
        hModuleRechercher = GetModuleHandle(Module);
     
        if( hModuleRechercher == NULL )
        {
           ERROR2("Module=%s inexistant", Module);
           return TRUE;
        }
        else
        {
            if(DisableThreadLibraryCalls(hModuleRechercher)!=0)
            {
                if(FreeLibrary(hModuleRechercher)==!0)
                {
                    CloseHandle( hModuleRechercher );
                    return TRUE;
                }
                else
                {
                    Erreur = GetLastError();
                    ERROR2("Module=%s", Module);
                    ERROR2("Code Erreur FreeLibrary = %d", Erreur);
     
                    FormatMessage(
                        FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                        NULL,
                        Erreur,
                        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                        lpBuffer,
                        dwBufferSize,
                        NULL);
     
                    ERROR1((LPTSTR) lpBuffer);
     
                    CloseHandle( hModuleRechercher );
                    return FALSE;
                }
            }
            else
            {
                Erreur = GetLastError();
                ERROR2("Module=%s", Module);
                ERROR2("Code Erreur DisableThreadLibraryCalls = %d", Erreur);
     
                FormatMessage(
                    FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                    NULL,
                    Erreur,
                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                    lpBuffer,
                    dwBufferSize,
                    NULL);
     
                ERROR1((LPTSTR) lpBuffer);
     
                CloseHandle( hModuleRechercher );
                return FALSE;
            }
        }
    }
    Lorsque j'exécute ceci, je n'ai pas d'erreur mais le module est toujours chargé en mémoire

  10. #10
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 18
    Par défaut
    Au temps pour moi, je pensais qu'il était écrit sur le disque. désolée ^^

  11. #11
    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
    Y-a pas de mal Juju666
    Sinon pour info j'ai juste le message d'erreur comme quoi le module recherché est "inexistant" donc en fait le "GetModuleHandle(Module);" retourne la valleur NULL.
    Ceci même si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Module="MaDll.dll"
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Module="C:\\Program Files\\Mon Appli\\MaDll.dll"

  12. #12
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Vouloir provoquer la libération d'un module chargé par un processus sur lequel tu n'as pas la main me paraît interdit par le cloisonnement entre application.

    Par contre, vu que tu travailles sous Windows, pourquoi ne pas envoyer au processus que tu veux arrêter le message Windows adéquat qui provoquera de toute façon le libération des ressources utilisées à la fermeture ?

  13. #13
    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
    Comment fait-on celà ?

    En fait le pb est que le module "MaDLL.dll" est attaché à processus "Explorer.exe" et ce module "MaDLL.dll" est situé dans le répertoire "C:\Program Files\Mon Appli"
    Et pour désinstaller "Mon Appli" à la Warrior car pas fonctionnel, il me faut aussi supprimer le répertoire "C:\Program Files\Mon Appli" mais comme "MaDLL.dll" est toujours attaché au processus "Explorer.exe" le répertoire ne veut pas être supprimé. Il reste donc plus que cette fameuse DLL et là c'est pas cool.

    J'arrive bien à trouver la DLL dans les modules rattachés aux différents processus mais je ne trouve pas comment la décharger complètement.
    Il y a bien "FreeLibrary" de Windows mais à chaque fois j'ai l'erreur comme quoi il ne trouve pas le module.

  14. #14
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Comment as-tu attacher une DLL à "Explorer.exe" ? As-tu réalisé un hook ?
    D'autre part je me rend compte que je ne comprends pas très bien sous quelle forme se présente ton appli et ce qu'elle fait ... si tu pouvais l'éclairer un peu

  15. #15
    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
    La DLL en question est une des DLL du logiciel que mon appli cherche à désinstaller à la warrior (selon les préconisations de l'éditeurs)

    En fait, le but de mon appli est de vérifier si le logiciel est installé, si oui elle vérifie la version et si la version est incorrecte alors mon appli va mettre à jour le logiciel. Si la version est correcte et que le logiciel ne fonctionne pas correctement car corrompu (pour une raison ou une autre) alors mon appli va supprimer le logiciel à la warrior pour ensuite installer le logiciel en question correctement.
    Le pb est que cette seule DLL qui me pose pb est rattachée au process Explorer.exe.
    J'ai bien contourné le pb en utilisant la fonction suivante mais ceci n'est pas des plus propres il me semble.

    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
     
        if(system("taskkill /T /FI \"MODULES eq MaDLL.dll\"")==0)
        {
            if(strcmp(DebugMode, "9")==0)
            {
                INFO1("SUPPRESSION : SUCCES : Dechargement Module MaDLL.dll");
            }
        }
        else
        {
            if(strcmp(DebugMode, "9")==0)
            {
                ERROR1("SUPPRESSION : ECHEC : Dechargement Module MaDLL.dll");
            }
        }
    PS : Ceci semble toutefois fonctionner correctement.

  16. #16
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Tu peux aussi certainement arrêter tout les programmes qui auraient chargés la DLL (tels qu'Explorer.exe), faire tes modifications sur le système de fichiers, puis relancer les programmes précédemment arrêtés.

  17. #17
    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 le processus "Explorer.exe" est assez "dangereux"
    Le but était simplement de décharger cette fameuse DLL sans toucher au système. Chose que j'ai faite avec la commande taskkill (en espérant que ceci fonctionne sur tous les systèmes Windows, aussi bien XP, que Vista, Seven, 2003, 2008 puisque mon appli doit être compatible avec tous ces systèmes aussi bien en 32bits qu'en 64Bits

+ 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