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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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