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 sigsuspend


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut Problème avec sigsuspend
    Bonjour,

    Je souhaite synchroniser deux processus avec le signal SIGUSR1 et la fonction sigsuspend. Par ailleurs, je rencontre un comportement étrange. Afin d'illustrer mon problème, j'ai créer un petit programme de test dont voici le 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
    39
    40
    41
    42
    43
    44
    45
    46
     
    /*
    ** File     : test_sigsuspend.c
    ** Author   : kal
    ** Created  : Fri Oct 12 19:46:12 2007
    */
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <sys/types.h>
    #include <unistd.h>
     
    void
    handler (int signal)
    {
      printf("coucou, je suis %d, reception du signal %d\n", getpid(), signal);
    }
     
    int
    main (int argc, char **argv)
    {
      sigset_t mask;
     
      /* bloque SIGUSR1 */
      sigemptyset (&mask);
      sigaddset (&mask, SIGUSR1);
      sigprocmask ( SIG_BLOCK, &mask, NULL);
     
      /* envoi de SIGUSR1 */
      kill(getpid(), SIGUSR1);
     
      /* handler SIGUSR1 */
      struct sigaction sa;
      sa.sa_handler = handler;
      sigaction(SIGUSR1,&sa,NULL);
     
      /* attente de SIGUSR1 */
      sigfillset (&mask);
      sigdelset (&mask, SIGUSR1);
      sigsuspend (&mask);
     
      printf("Fin\n");
     
      return EXIT_SUCCESS;
    }
    Le code est plutot simple : je masque le signal SIGUSR1, je m'envoi SIGUSR1. Il est donc placé dans la liste des signaux pendants. Je me met en attente de celui-ci grace à sigsuspend.

    Puisqu'un handler est définit pour SIGUSR1, sigsuspend est censé retourner en restaurant le masque des signaux. Or, voici le résultat de l'exécution :
    kal@kal-laptop:~/POSIX$ ./test_sigsuspend
    coucou, je suis 6878, reception du signal 10
    Erreur de segmentation (core dumped)
    Par ailleurs, si j'ajoute une variable non utilisée de type sigset_t, alors le comportement est correct :
    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
     
    /*
    ** File     : test_sigsuspend.c
    ** Author   : kal
    ** Created  : Fri Oct 12 19:46:12 2007
    */
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <sys/types.h>
    #include <unistd.h>
     
    void
    handler (int signal)
    {
      printf("coucou, je suis %d, reception du signal %d\n", getpid(), signal);
    }
     
    int
    main (int argc, char **argv)
    {
      sigset_t mask, toto;
     
      /* bloque SIGUSR1 */
      sigemptyset (&mask);
      sigaddset (&mask, SIGUSR1);
      sigprocmask ( SIG_BLOCK, &mask, NULL);
     
      /* envoi de SIGUSR1 */
      kill(getpid(), SIGUSR1);
     
      /* handler SIGUSR1 */
      struct sigaction sa;
      sa.sa_handler = handler;
      sigaction(SIGUSR1,&sa,NULL);
     
      /* attente de SIGUSR1 */
      sigfillset (&mask);
      sigdelset (&mask, SIGUSR1);
      sigsuspend (&mask);
     
      printf("Fin\n");
     
      return EXIT_SUCCESS;
    }
    kal@kal-laptop:~/POSIX$ ./test_sigsuspend
    coucou, je suis 6914, reception du signal 10
    Fin
    Quelqu'un peut il m'expliquer ce comportement étrange ?

  2. #2
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Ah oui, j'ai oublié de préciser : l'environnement utilisé est Linux avec le compilateur GCC 4.1.3.

    Kal

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Il faut peut être appeler kill pour l'envoi du signal APRES avoir mis en place le handler qui est fait par l'appel de sigaction.

  4. #4
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Non, ceci ne change rien. J'ai tout de même testé pur m'en assurer et j'obtiens toujours une erreur de segmentation.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Par défaut
    Bonjour,

    Avant d'appeler sigaction, tu dois initialiser ta structure sa.
    Rajoute sa.sa_flags=0;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      /* handler SIGUSR1 */
      struct sigaction sa;
      sa.sa_handler = handler;
      printf("avant initialisation sa.sa_flags=%d\n",sa.sa_flags);  /* Pour voir */
      sa.sa_flags=0; /* Ligne a rajouter */
      sigaction(SIGUSR1,&sa,NULL);
     
      /* attente de SIGUSR1 */
    Bonne continuation

  6. #6
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Merci beaucoup, Fred83!

    En effet, cela fonctionne, je n'ai pu besoin de déclarer une variable non utilisée de type sigset_t. Par contre, je ne comprend pas pourquoi il faut initialiser sa_flags, et pourquoi il influence sur le comportement de sigsuspend.

    Merci encore,
    Kal

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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