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 :

Fonction alarm et signal


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut Fonction alarm et signal
    Bonjour,

    J'aimerai savoir ce que font exactement les fonction alarm et signal et comment se comportent t'elles.

    Exemple :
    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
    void main (void)
    {
    ...
    function();
    ...
    }
     
    void function()
    {
    int timeout 30;
    ...
    (void) signal( SIGALRM, sigcatch );
    ...
    (void) alarm( timeout );
    ...
    }
     
    static void sigcatch( int sig )
    {       
    	(void) fprintf( stderr, "%s: %s - timed out\n", argv0, url );
    	exit( 1 );
    }
    Est t'il possible de réinitialiser le compteur à Zéro ?

  2. #2
    Membre éclairé Avatar de Seandest
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Avril 2006
    Messages : 54

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Ok j'avais déjà regardé ca avant deposter, j'essaye toujours d echercher un minimum avant.

    Par contre j'ai poster parceque je ne suis pas sure d'avoir tout bien compris le fonctionement.

    Ce que j'aimerai savoir c'est comment va se comporter la ligne :
    (void) alarm( timeout );

    qui se trouve dans une sous fonction du main mais est rappellé très régulièrement.

    Quand je vais passer dessus ca remet a zéro le timeout a chaque fois, mais si je repasse dans la fonction apres le timeout qu'est-ce qui se passe. Ca va arretter le programme ?

  4. #4
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Un exemple commenté:
    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
    47
    48
    49
    50
     
    /* Gestion des signaux  - */
     
    /*  Mise en place d'une temporisation - Utilisation d'un saut non local
    Le programme principal attend 5 seconde la saisie d'une valeur
    Quand le delai est depasse, il affiche un message et se termine
     
    - Envoi du signal SIGALRM au bout de 5 secondes
    - La fonction de gestion du signal renvoie au programme principal
     
    */
     
    #include <stdio.h>
    #include <signal.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <setjmp.h>
     
    sigjmp_buf contexteAlarme;
     
    void gestionAlarme(int numSig) {
      siglongjmp( contexteAlarme, 1); /* branchement a sigsetjmp() en retournant 1 */
    }
     
    int main(void) {
     
      int i;
     
    /* Installation du handler gestionAlarme  pour SIGALRM */
     
      signal(SIGALRM,gestionAlarme); 
     
    /* Traitement */
     
      printf("Vous avez 5 secondes pour entrer un nombre entier\n");
     
    /* Memorisation du contexte d'execution */
     
      if (!sigsetjmp(contexteAlarme, 1)) { /* 1er passage */
        alarm(5);     /* Mise en place du timer */
        scanf("%d", &i);  
        alarm(0);  /* saisie effectuee, on annule le timer */
        printf("OK: %d saisi\n",i);
      }
      else {
        printf("Vous n'avez rien saisi. Bye!!!\n");
      }
     
      return(0);
    }
    Au bout de 5 secondes, le signal SIGALRM est envoyé. Il renvoie au sigsetjump avec la valeur 1.
    On passe donc dans la branche else du test et le programme se termine.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Citation Envoyé par joellel
    Un exemple commenté:
    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
    47
    48
    49
    50
     
    /* Gestion des signaux  - */
     
    /*  Mise en place d'une temporisation - Utilisation d'un saut non local
    Le programme principal attend 5 seconde la saisie d'une valeur
    Quand le delai est depasse, il affiche un message et se termine
     
    - Envoi du signal SIGALRM au bout de 5 secondes
    - La fonction de gestion du signal renvoie au programme principal
     
    */
     
    #include <stdio.h>
    #include <signal.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <setjmp.h>
     
    sigjmp_buf contexteAlarme;
     
    void gestionAlarme(int numSig) {
      siglongjmp( contexteAlarme, 1); /* branchement a sigsetjmp() en retournant 1 */
    }
     
    int main(void) {
     
      int i;
     
    /* Installation du handler gestionAlarme  pour SIGALRM */
     
      signal(SIGALRM,gestionAlarme); 
     
    /* Traitement */
     
      printf("Vous avez 5 secondes pour entrer un nombre entier\n");
     
    /* Memorisation du contexte d'execution */
     
      if (!sigsetjmp(contexteAlarme, 1)) { /* 1er passage */
        alarm(5);     /* Mise en place du timer */
        scanf("%d", &i);  
        alarm(0);  /* saisie effectuee, on annule le timer */
        printf("OK: %d saisi\n",i);
      }
      else {
        printf("Vous n'avez rien saisi. Bye!!!\n");
      }
     
      return(0);
    }
    Au bout de 5 secondes, le signal SIGALRM est envoyé. Il renvoie au sigsetjump avec la valeur 1.
    On passe donc dans la branche else du test et le programme se termine.

    Ok merci ca ma éclairé, mais y a enccore un truc que je ne comprend pas trop dans cet exemple, c'est le saut. Je vois pas bien comment il se déclanche et ou il va.

  6. #6
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    sigsetjmp (buffer, ...) ---> lors de l'appel, mémorise le contexte d'exécution dans le buffer et renvoie 0.
    siglongjmp(buffer, valeur) ---> branchement au sigsetjmp() correspondant au buffer passé en paramètre. A ce moment, sigsetjmp() retourne la valeur envoyée par siglongjmp (dans l'exemple, 1)

    J'espère que j'ai été assez claire

    J'ai oublié quelque chose:
    le saut se déclenche quand le timer est arrivé au bout des 5 secondes et que la fonction de traitement de SIGALRM est donc appelée.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Les fonctions alarm et signal fonctionne tel sur tout les systèmes linux en particulier sur l'embarqué et sur tout type de processeur ?.
    Car apparement dans mon cas, developpement sur linux embarqué à base de processeur ARM, les fonctions ne font rien.

    Le programme est bien compilé sans erreur ou warning a ce sujet, par contre la fonction de timeout ne fait rien. En claire même si le timeout inscrit dans alarm est écoulé le programme suit son cours normalement.

  8. #8
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Il n'y a pas de raison que ça ne marche pas, c'est du standard! De plus, j'ai vu dans un forum que le signal SIGALRM fonctionne avec un Linux embarqué sur ARM.

    Montre ton code, peut être que le traitement du signal pose un problème et que tu ne vois pas qu'il est généré!

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Citation Envoyé par joellel
    Il n'y a pas de raison que ça ne marche pas, c'est du standard! De plus, j'ai vu dans un forum que le signal SIGALRM fonctionne avec un Linux embarqué sur ARM.

    Montre ton code, peut être que le traitement du signal pose un problème et que tu ne vois pas qu'il est généré!

    Bein le programme marche très bien sur un x86 avec debian mais pas sur le sysytème embarqué.

    Le code est long alors je met le fichier en ligne.

    Fichier

    L'appel à signal se trouve dans la fonction "post" et les appels à alarm dans la fonction "postURLbyParts".

  10. #10
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    J'ai quelques remarques sur ton code, mais rien de flagrant si tu dis que ça fonctionne avec une Debian.
    - Teste le code retour de signal(), il peut y avoir un problème.
    - Tu n'arrêtes jamais la tempo (alarm(0))
    - Ensuite, tu devrais essayer d'utiliser sigaction() plutôt que signal() pour mettre en place ton handler. Ca permet de gérer vraiment le masque des signaux.
    Voilà un exemple d'utilisation, mais tu peux aller plus loin, regarde le man
    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
     
     sigset_t masque;
     struct sigaction act;
     
      /* Application du masque de blocage des signaux : on interdit au processus de recevoir CTRL-C (SIGINT). Tous les autres signaux sont autorisés */
     
      sigemptyset(&masque);
      sigaddset(&masque, SIGINT);
      sigprocmask(SIG_SETMASK, &masque, NULL);
     
    /* Installation du handler foncSig() pour SIGUSR1 et SIGUSR2. On interdit la reception de tout  signal durant l'execution de la fonction espion() */
     
      act.sa_handler=foncSig;
      act.sa_flags=0;
      sigfillset(&(act.sa_mask));
      sigaction(SIGUSR1, &act, NULL);
      sigaction(SIGUSR2, &act, NULL);

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/02/2015, 00h04
  2. Réponses: 5
    Dernier message: 10/12/2007, 03h02
  3. [fonction alarm] : non déclenchée en C/linux
    Par kilou dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 10/10/2007, 13h21
  4. Réponses: 1
    Dernier message: 10/05/2006, 09h47
  5. Appeler une autre fonction depuis un signal
    Par laurent_ifips dans le forum POSIX
    Réponses: 6
    Dernier message: 24/12/2005, 15h40

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