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 :

Sigqueue - Mon processus ne reçoit pas tout les signaux


Sujet :

POSIX C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 4
    Par défaut Sigqueue - Mon processus ne reçoit pas tout les signaux
    Bonjour, j'ai un problème avec la fonction sigqueu.
    Voici le contexte:

    L'exercice que je réalise me demande de mettre en évidence que les signaux kill() ne sont pas mémorisé au contraire des signaux sigqueue().

    Pour ce faire j'utilise deux processus. Un premier qui demande implémente un handler. Ce dernier incrémente une variable et affiche un texte.

    Le deuxième processus demande le pid du premier comme paramètre et envoie une série de 10 signals à ce dernier.

    Afin de montrer que sigqueue mémorise les signaux envoyé j'envoie les signaux toute les secondes mais le handler lui en prend 2 pour réaliser son opération (simulation avec sleep()).

    Le problème étant que je ne reçois pas tout les signaux dans mon handler. Contrairement à ce que je dois prouver...

    Le code de mes deux processus:

    Processus 1:
    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
     
    #include <stdio.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <signal.h>
     
    void	handler_signaux();
    int nbrsig;
     
    int main()
    {
      struct sigaction sig_act;
      nbrsig = 0;
     
      int	ret_val;
     
      sig_act.sa_handler = handler_signaux;
      sigemptyset(&sig_act.sa_mask);
      sig_act.sa_flags = SA_SIGINFO;
     
      ret_val = sigaction ( SIGUSR1 , &sig_act, NULL );
      if ( ret_val == -1 )
        perror ( "\n\rMain !!! ERREUR sigaction" );
     
      printf("\nPid: %d\n", getpid());
     
      while(1){
        printf("\nNombre de signaux reçus: %d\n", nbrsig);
        fflush(NULL);
        pause();
      }
      return 0;
    }
     
    void	handler_signaux ( int signal, struct siginfo *siginfo_hdler , int *val )
    {
      int i;
      //for(i=0; i<10000000; i++){} //heavyload
      sleep(2);
     
      nbrsig++;
      printf ("\n\rHandler, signal : %d ", signal );
      fflush(NULL);
    }
    Processus 2:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <signal.h>
    #include <unistd.h>
     
    int main(int argc, char *argv[])
    {
      int i,pid;
      union	sigval	sigval_appl ;
      int	ret_val;
     
      pid = atoi(argv[1]);
     
      sigval_appl.sival_int = 25 ;
     
      // envoi avec sigqueue 
      for(i = 0; i < 10; i++)
      {
       /* kill(pid,SIGUSR1);*/
        printf("Envoie signal %d",i);
        fflush(NULL);
        ret_val = sigqueue( pid, SIGUSR1 , sigval_appl );
        if ( ret_val == -1 )
          perror ( "\n\rMain !!! ERREUR sigqueue" );
     
        sleep(1);
     
      }
     
      //sleep(10);
      return 0;
    }
    Si quelqu'un pouvait m'éviter de finir chauve aujourd'hui a force de m'arracher les cheveux, j'apprécierais

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut


    ben tu n'envoies que SIGUSR1...


  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 4
    Par défaut
    Citation Envoyé par souviron34 Voir le message


    ben tu n'envoies que SIGUSR1...

    Merci pour la réponse mais je ne comprend pas la remarque : / . Je me doute bien que je passe à coté de quelque chose d'évident, mais je ne vois pas.

    J'envoie effectivement 10x SIGUSR1 à 1 seconde d'intervalle.

    Mon handler n'est capable de gérer ce signal que toute les 2 secondes. Mais vu que j'utilise sigqueue ces signaux devrait être mémorisé par le système et transmis à mon handler dès qu'il n'est plus occupé non?

    Autrement dit. Si j'envoie le "i" de ma boucle d'envoi de signal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for(i = 0; i < 10; i++)
      {
       /* kill(pid,SIGUSR1);*/
        printf("Envoie signal %d",i);
        fflush(NULL);
        sigval_appl.sival_int = i ;
        ret_val = sigqueue( pid, SIGUSR1 , sigval_appl );
        if ( ret_val == -1 )
          perror ( "\n\rMain !!! ERREUR sigqueue" );
     
        sleep(1);
     
      }
    Et que je modifie légèrement mon handler pour l'afficher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void	handler_signaux ( int signal, struct siginfo *siginfo_hdler , int *val )
    {
      int i;
      //for(i=0; i<10000000; i++){} //heavyload
      sleep(2);
     
      nbrsig++;
      printf ("\n\rHandler, signal : %d ", signal );  
      printf ("\n\rHandler, si_value : %d ", siginfo_hdler->si_value.sival_int );
      fflush(NULL);
    }
    Mon résultat est:

    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
     
    Pid: 7421
     
    Nombre de signaux reçus: 0
     
    Handler, signal : 10 
    Handler, si_value : 0 
    Handler, signal : 10 
    Handler, si_value : 1 
    Handler, signal : 10 
    Handler, si_value : 2 
    Handler, signal : 10 
    Handler, si_value : 4 
    Handler, signal : 10 
    Handler, si_value : 6 
    Handler, signal : 10 
    Handler, si_value : 8 
    Nombre de signaux reçus: 6
    Je ne reçoit donc pas le 3, le 5 et le 9.

    Je ne sais pas si mon problème est plus claire?

Discussions similaires

  1. [MySQL] Mon client ne reçoit pas les courriels envoyés par mon formulaire (mais moi oui)
    Par carogilb19 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 16/08/2012, 19h09
  2. Réponses: 1
    Dernier message: 31/12/2008, 16h50
  3. Réponses: 1
    Dernier message: 26/10/2006, 17h44
  4. Réponses: 11
    Dernier message: 04/05/2006, 11h50

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