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 :

Problème avec le signal SIGCHLD


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Problème avec le signal SIGCHLD
    Bonjour,

    J'ai un petit soucis avec le signal SIGCHLD et je comprend pas d'ou ça vient

    Le programme que je lance est tout 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <stdio.h>
    #include <unistd.h>
    #include <signal.h>
     
    static int test();
     
    int main(int argc, char *argv[])
    {
            test();
            usleep(5000000);
    }
    static int test()
    {
            int ret;
            int localPid = 0;
            char *envp2[] = { 0 };
            char *argv2[] = { "/tmp/scripts/vars.sh", NULL };
     
     
            localPid = fork();
            if (localPid != 0)
            {
                    return 0;
            }
            else
            {
                    signal(SIGCHLD, SIG_IGN);
                    execve("/tmp/scripts/vars.sh", argv2, envp2);
                    _exit (0);
            }
    }
    Le shell vars.sh ressemble à ça:
    #!/bin/sh
    set -x
    env

    su - toto -c "sleep 1"
    ERR=$?
    echo $ERR
    Mon problème c'est qu'en retour du 'su' j'optiens pas le code 0.

    + env
    PWD=/root/pascal/scripts
    SHLVL=1
    _=/bin/env
    + su - toto -c 'sleep 1'
    + ERR=223
    + echo 223
    223
    Par contre, lorsque j'enlève le signal ou je que je défini une fonction pour traité ce signal comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ....
    signal(SIGCHLD, titi);
    ....
    void titi(int sig)
    {
    	return;
    }
    ...
    J'ai bien le code 0

    + env
    PWD=/root/pascal/scripts
    SHLVL=1
    _=/bin/env
    + su - toto -c 'sleep 1'
    + ERR=0
    + echo 0
    0
    Savez-vous pourquoi dans le premier cas j'optiens pas le code 0 alors qu'avec SIG_IGN on est censé ignoré le signal?

    Merci pour votre aide

  2. #2
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Sur ce lien il est dit que certains signaux ne peuvent ignorer par SIG_IGN, cependant SIGCHLD n'en fait pas partie. J'avais rencontre ce probleme aussi mais je l'avais finalement regle de la meme facon que toi. A approfondir donc.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Hello,

    • signal() et sigaction() servent à définir un gestionnaire à appeler lorsque l'on reçoit un signal. Pas lorsque l'on désire en émettre. C'est donc le père qui doit appeler signal() et qui recevra le signal SIGCHLD quand son processus fils sera mort. Un signal() dans le fils n'a aucune utilité ;
    • execve() et ses variantes servent à remplacer le processus qui l'appelle par l'image d'un autre exécutable en langage machine contenu dans un fichier. Ton script shell n'en est pas un. Grâce au prologue « #!/bin/sh », c'est le shell qui sera lancé et lui, à son tour, interprétera le script passé en argument. Il est important de noter que exec--() remplace le processus et ne lance pas un processus fils ;
    • Sauf si « toto » est défini sans, la commande « su » aura besoin du mot de passe de l'utilisateur « toto » pour poursuivre ;
    • Dans tous les cas, le code que tu reçois, qu'il s'agisse de 0 ou de 223, est sans rapport aucun avec le fait d'avoir appelé ou non signal(SIGCHLG).


    Bon courage.

Discussions similaires

  1. probléme avec les signal "cliked"
    Par dev-linus dans le forum GTK+ avec C & C++
    Réponses: 14
    Dernier message: 22/03/2012, 22h07
  2. Réponses: 1
    Dernier message: 11/05/2010, 14h58
  3. Problème avec un signal/slot
    Par scary dans le forum Qt
    Réponses: 12
    Dernier message: 11/12/2009, 21h20
  4. Problème avec Signal express
    Par ABN84 dans le forum LabVIEW
    Réponses: 1
    Dernier message: 20/04/2009, 19h16
  5. Problème avec un signal capricieux
    Par Athel dans le forum Qt
    Réponses: 3
    Dernier message: 15/05/2008, 16h53

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