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 :

Signaux et threads


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Par défaut Signaux et threads
    Bonjour,

    Je suis sur un programme C++ utilisant différents threads ayant des fonctions fort similaires et j'aimerais essayer de les quitter proprement en interceptant un signal (ou si une autre méthode existe ...)

    Ces threads sont composés d'une boucle infinie et le main ne s'occupe que de lancer les threads. Ce qui complique un peu la chose est que les threads font des appels system à tracepath, ping, whois et donc lorsque ctrl-c est pressé, le signal n'est pas intercepter par mon programme mais bien par une des commandes citées plus haut.

    Pour le moment, je fais dans chaque thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct sigaction;
    a.sa_handler = ctrlz_handler;
    sigaction(SIGTSTP, &a, NULL);
    Mon handler est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void ctrlz_handler(int sig) {
        if (sig == SIGTSTP) {
            ctrlz_pressed = 1;
            puts("Exiting proprely");
        }
    }
    Et donc dans les boucles je fais un pthread_exit(NULL), si ctrlz_pressed est à 1.

    Le signal est bien intercepté par le handler mais tout de suite après j'ai un Segmentation fault ce qui fait que les threads ne se terminent pas proprement. Est ce la bonne façon de procéder car je suis bloqué depuis quelques jours sur ce problemes ?

    Si vous connaissez un autre moyen, je suis interessé

    Voila, merci d'avance

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Ce n'est pas le meilleur moyen de faire effectivement, le mieux est, si tu le peux, tu stockes tes pthread_t au fur et à mesure que tu créer des threads, dans tous les threads sauf le main, tu bloques tous les signaux. Quand le thread main reçoit le signal de ton choix, tu fais un pthread_kill() sur tous tes threads.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Par défaut
    Le problème c'est que je n'arrive pas à intercepter un signal qui me permettent de faire ca. De plus, comment faire les kill a partir du main si celui-ci est fini et que les threads tournent tjs (le main ne fait que lancer les threads).

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 107
    Par défaut
    Nicolas.sitbon a raison, il faut que les threads que tu lances bloquent les signaux afin que se soit ton main qui les reçoives.
    Le main pourra alors interrompre les threads qu'il a lancés.
    Pour qu'un thread bloque certains signaux, il suffit qu'il appel une fonction de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    static void bloquerSignaux( ){
        //les threads créés ne doivent pas recevoirs de signaux :
        //on les bloques pour que se soit le thread principale, 
        //executant le main, qui les reçoivent :
        sigset_t masque;
        sigemptyset(&masque);
        sigaddset(&masque, SIGTERM);
        sigaddset(&masque, SIGINT);
        sigaddset(&masque, SIGHUP);
        pthread_sigmask(SIG_BLOCK, &masque, NULL);   
    }
    Par contre il faut que ton main ne finisse pas avant les threads qu'il a lancés. Pour ça tu peux utiliser pthread_join.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Par défaut
    La fonction bloquer signaux semble marcher correctement quand je l'appele via les threads mais on dirait aussi que le main ne peux plus récupérer ces signaux. Le handler ne semble pas être appelé ...

    Pour le moment je teste seulement avec un thread. Mais est ce que je peux, à partir du main, lancer plusieurs threads avec pthread_join ? Ou seul un seul pthread_join marchera à la fois ... (les threads doivent fonctionner simultanément).

    Pour capturer le signal dans le main j'utilise la technique citée plus haut. (comprenant également les signaux : SIGINT, SIGQUIT).

    Merci

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Par défaut
    J'ai enfin réussi à faire marcher ça. Merci à vous ! J'avais mal placé le sigaction ...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/10/2014, 08h20
  2. Réponses: 4
    Dernier message: 18/06/2014, 14h57
  3. threads et signaux
    Par igor24 dans le forum Linux
    Réponses: 8
    Dernier message: 05/04/2007, 16h44
  4. [Qt 4] signaux non reçus entre thread
    Par tut dans le forum Qt
    Réponses: 6
    Dernier message: 28/10/2006, 13h52
  5. pb signaux (et threads..)
    Par ramislebob dans le forum Langage
    Réponses: 1
    Dernier message: 10/07/2006, 14h25

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