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

POSIX C Discussion :

Tuer processus fils


Sujet :

POSIX C

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Tuer processus fils
    Bonjour,

    J'ai créé un programme (qui tourne sous Linux) qui crée 2 processus fils, le premier processus est chargé de réaliser un transfert de fichiers par FTP pendant que le deuxième attend pendant n minutes. Si le transfert FTP ne s'est pas terminé avant le délai imparti, mon programme doit tuer ce processus.

    Mon problème est que j'ai l'impression que la commande kill(pid,SIGKILL) ne fait rien !

    Voici mon code :
    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
     
            pid_fils_ftp = fork();  /* creation du premier fils */
            if (pid_fils_ftp==-1)
            {
                   /* probleme lors de la creation du fils */
            }
            if (pid_fils_ftp==0)
            {
                   /* Transfert FTP */
                   exit(0);
            }
            else
            {
                pid_fils_timeout = fork();   /* creation du second fils */
                if (pid_fils_timeout==-1)  
                {
                    /* probleme lors de la creation du fils */
                }
                if (pid_fils_timeout==0)    
                {
                    sleep(50);        /* attente pendant 50 sec */
                    exit(0);
                }
                else
                {
                    pid_recup = wait(0);    /* recuperation du pid du premier processus termine */
                    if (pid_recup==pid_fils_ftp)
                    {
                        /* le transfert FTP s'est termine avant le timeout */
                        kill(pid_fils_timeout, SIGKILL);
                    }
                    if (pid_recup==pid_fils_timeout)
                    {
                        /* le timeout s'est termine avant la fin du transfert FTP */
                        kill(pid_fils_ftp, SIGKILL);
                    }
                }
             }
    Si vous avez des critiques ou des remarques, n'hésitez pas à m'en faire part. Merci d'avance !

    Lornak

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    Citation Envoyé par lornak
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      if (pid_fils_ftp==-1) 
        /* probleme lors de la creation du fils */
      if (pid_fils_ftp==0)
        [...]
    Cela revient à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      if (pid_fils_ftp==-1) 
      {
        /* probleme lors de la creation du fils */
        if (pid_fils_ftp==0)
          [...]
      }


    Citation Envoyé par lornak
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pid_recup = wait(0);    /* recuperation du pid du premier processus termine */
    Tu ne récupère pas le pid du fils mais tu attend qu'un processus du même groupe que celui ci se termine donc tu peux toujours le tuer par la suite, il est déjà terminé !

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par gege2061
    Cela revient à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      if (pid_fils_ftp==-1) 
      {
        /* probleme lors de la creation du fils */
        if (pid_fils_ftp==0)
          [...]
      }
    Oups, je suis allé un peu vite en recopiant le code


    Citation Envoyé par gege2061
    Tu ne récupère pas le pid du fils mais tu attend qu'un processus du même groupe que celui ci se termine donc tu peux toujours le tuer par la suite, il est déjà terminé !
    Ok, je pensais récupérer le pid du premier processus terminé. Ainsi si le fils1 était terminé en premier, je tuais le fils2 et vice-versa.

    Donc je ne recupère pas le pid, mais n'existe-t-il pas un moyen permettant de connaitre ce pid ?

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par lornak
    Ok, je pensais récupérer le pid du premier processus terminé. Ainsi si le fils1 était terminé en premier, je tuais le fils2 et vice-versa.

    Donc je ne recupère pas le pid, mais n'existe-t-il pas un moyen permettant de connaitre ce pid ?
    Bon je viens de prendre mon 4 heure, ça va mieux

    Ok j'avais pas vu ça comme ça Tu peux faire plus simple :
    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
    pid_fils_ftp = fork();  /* creation du premier fils */
    if (pid_fils_ftp==-1)
    {
      /* probleme lors de la creation du fils */
    }
    else if (pid_fils_ftp==0)
    {
      /* Transfert FTP */
      exit(0);
    }
    else
    {
      sleep (50);
      kill (pid_fils_ftp, SIGKILL);
    }
    Par contre je n'ai pas trouvé de moyen de connaitre l'état d'un processus grâce à son pid (si on tue pid_fils_ftp alors qu'il est déjà terminé, rien ne nous assure qu'un autre processus n'a pas était lancé entre deux avec le même pid ).

    Je vais regarder ton code de plus près (avec un compilateur sous la main) parce que normalement ça devrait fonctionner

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par gege2061
    Par contre je n'ai pas trouvé de moyen de connaitre l'état d'un processus grâce à son pid (si on tue pid_fils_ftp alors qu'il est déjà terminé, rien ne nous assure qu'un autre processus n'a pas était lancé entre deux avec le même pid ).
    Tu es sûr ? Il me semblait justement qu'un processus ne pouvait être terminé que par son père, donc tant que le père vit, il doit rester quelque chose de ce processus, non ?

    [troll mode="velu"]On n'a pas ce genre de problèmes sous Windows...[/troll]
    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.

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Médinoc
    Tu es sûr ? Il me semblait justement qu'un processus ne pouvait être terminé que par son père, donc tant que le père vit, il doit rester quelque chose de ce processus, non ?
    Oui effectivement, le processus devient zombi donc ça devrait marcher

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par gege2061
    Oui effectivement, le processus devient zombi donc ça devrait marcher
    Je confirme.

    Sinon pour être sûr, faudrait taper dans l'arborescence /proc pour vérifier le ppid du processus. Mais la portabilité du code est alors à revoir car je ne suis pas sûr que toutes les distrib gérent cette arborescence de la même façon.

    Jc

  8. #8
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'ai fait appel à un expert qui a conclu que le code fonctionne bien, le problème provient de la façon dont j'effectue le transfert FTP : j'utilise un popen en passant la commande shell "ftp -n .....". Celle-ci crée un processus qui ne se termine que lorsqu'il a consommé toutes les commandes, voilà pourquoi j'avais l'impression que je ne tuais pas le processus.

    Afin de tuer le bon processus, la solution consiste à propager le SIGTERM jusqu'au processus créé par le popen.
    Pour cela, il faut récupérer le PID par l'intermédiaire du pipe, ouvert en lecture/ecriture en utilisant la commande "ftp -n ... &echo \"PID=$!\";exit $!" , puis lire la ligne PID=n et mettre en place un handler sur SIGTERM de façon à tuer le processus ftp.

    Voilà, il ne reste plus qu'à implémenter la solution.

    Merci à tous.

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

Discussions similaires

  1. Tubes et processus fils
    Par Jopzeut dans le forum Linux
    Réponses: 3
    Dernier message: 18/03/2011, 18h03
  2. Tuer les processus fils
    Par soony dans le forum Linux
    Réponses: 4
    Dernier message: 12/12/2006, 13h08
  3. Executer commande dans un processus fils !
    Par jérôme.D dans le forum POSIX
    Réponses: 6
    Dernier message: 23/11/2006, 22h14
  4. terminaison du processus fils
    Par zahira dans le forum POSIX
    Réponses: 3
    Dernier message: 08/04/2006, 13h35
  5. Partage d'une variable entre les processus fils
    Par Mehdi Feki dans le forum Linux
    Réponses: 7
    Dernier message: 09/01/2005, 13h34

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