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 :

[timer en C sous linux] comment stopper un timer


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 107
    Points : 82
    Points
    82
    Par défaut [timer en C sous linux] comment stopper un timer
    Bonjour
    un histoire de temps !!
    Voici un timer en C qui fonctionne sur un système unix (par appel système).
    Une fois lancé ce timer fonctionne en boucle, a chaque fin de la tempo il exécute proc.
    Comment fait on pour l'arrêter pendant son exécution (cf dernieres lignes du programme)
    avez-vous des pistes?
    Merci

    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
    #include <stdio.h>
    #include <signal.h>
    #include <sys/time.h>
    #include <errno.h>
     
    extern int errno;
     
    void proc(){/*procedure executee lorsque le signal SIGALRM est recu */
      fprintf(stdout,"5 secondes ecoulees!\n"); 
    }
     
    main(){
      char input[30];
      struct itimerval timer; /
     
    #ifdef BSD
      signal(SIGALRM,proc);  
    #else 
      struct sigaction act;
      act.sa_handler = proc;
      act.sa_flags = SA_RESTART; 
      if(sigaction(SIGALRM, &act, NULL) == -1) {
        fprintf(stderr,"error %d in sigaction\n");
      }
    #endif
     
    /* Config du timer */
      timer.it_interval.tv_sec = 5;  
      timer.it_interval.tv_usec = 0; 
      timer.it_value.tv_sec = 5;     
      timer.it_value.tv_usec = 0;    
      setitimer(ITIMER_REAL, &timer, 0); 
      while(1){
        while((fscanf(stdin,"%30s",input)<0)&&(errno=EINTR));
        fprintf(stdout,"%s\n",input); 
    	if(!strncmp(input,"quit",5)){	/* demade de stop timer*/
                memset(&timer, 0, sizeof(timer));	/* MARCHE PAS*/
            } 
      }
    }

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par untipy
    Voici un timer en C qui fonctionne sur un système unix (par appel système).
    Une fois lancé ce timer fonctionne en boucle, a chaque fin de la tempo il exécute proc.
    Comment fait on pour l'arrêter pendant son exécution (cf dernieres lignes du programme)
    [Unixoïde]
    Utilise plutôt select().

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    j'ai trouvé de la doc
    As tu un exemple stp ?

  4. #4
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par untipy
    Bonjour
    un histoire de temps !!
    Voici un timer en C qui fonctionne sur un système unix (par appel système).
    Une fois lancé ce timer fonctionne en boucle, a chaque fin de la tempo il exécute proc.
    Comment fait on pour l'arrêter pendant son exécution (cf dernieres lignes du programme)
    avez-vous des pistes?
    Merci
    Une solution serait peut être de restituer l'ancien gestionnaire d'alarme et l'ancien timer :
    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
    int main(void)
    {
        [...]
        struct itimerval timer;
        struct itimerval old_timer;
    
        [...]
        
        struct sigaction act;
        struct sigaction old_act;
        
        [...]
        
        if(sigaction(SIGALRM, &act, &old_act) == -1)
        {
            fprintf(stderr,"error %d in sigaction\n");
        }
    
        [...]
        
        if ( getitimer(ITIMER_REAL, &old_timer) != 0)
        {
            /* Traitement d'erreur */
        }
        
        if ( setitimer(ITIMER_REAL, &timer, 0) != 0)
        {
            /* Traitement d'erreur */
        }
        
        while(1)
        {
            [...]
            
            if(!strncmp(input,"quit",5))
            {	/* demade de stop timer*/
                    if ( setitimer(ITIMER_REAL, &old_timer, 0) != 0)
                    {
                        /* Traitement d'erreur */
                    }
                    
                    if( sigaction(SIGALRM, &old_act, NULL) != 0)
                    {
                        /* Traitement d'erreur */
                    }
            }
        }
        
        return 0;
    }

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Voici un petit exemple utilisant select() pour attendre 5 secondes pour que l'utilisateur entre quelque-chose. S'il l'a fait, on imprime ce qui a ete saisit. Tu devrais pouvoir l'adapter a ton usage.
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/time.h>
     
    static int input_timeout(int filedes, unsigned int seconds)
    {
      fd_set set;
      struct timeval timeout;
     
      /* 
       * Initialize the file descriptor set. 
       */
      FD_ZERO(&set);
      FD_SET(filedes, &set);
     
      /* 
       * Initialize the timeout data structure. 
       */
      timeout.tv_sec = seconds;
      timeout.tv_usec = 0;
     
      /* 
       * select returns 0 if timeout, 1 if input available, -1 if error. 
       */
      return select(FD_SETSIZE, &set, NULL, NULL, &timeout);
    }
     
    static void get_and_display(FILE *f)
    {
    #define MAXLEN 10
      char line[MAXLEN];
      char *p;
     
      fgets(line, sizeof line, f);
     
      p = strchr(line, '\n');
      if (p != NULL)
      {
        *p = '\0';
      }
      else
      {
        fprintf(stderr, "Line too long: Will be truncated.\n");
        line[MAXLEN - 1] = '\0';
        {
          /*
           * empty the stdin buffer
           */
          int c;
          while ((c = fgetc(f)) != '\n' && c!= EOF);
        }
      }
    #undef MAXLEN
     
      printf("You entered %s.\n", line);
    }
     
    int main (void)
    {
      int ret;
      int seconds = 5;
     
      printf("You have %d seconds to enter something.\n", seconds);
      ret = input_timeout(STDIN_FILENO, seconds);
     
      switch (ret)
      {
        case 1:
          get_and_display(stdin);
          break;
        case 0:
          printf("Time elapsed.\n");
          break;
        case -1:
          perror("select() on standard input");
      }
     
      return 0;
    }

  6. #6
    Expert éminent sénior

    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
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    c'est pas memset qu'il faut mettre.. Il faut remettre tous les champs à 0, et faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
           rttimer.it_value.tv_sec     = 0 ;
           rttimer.it_value.tv_usec    = 0 ;
           rttimer.it_interval.tv_sec  = 0 ;
           rttimer.it_interval.tv_usec = 0 ;
     
           signal ( SIGALRM, (void (*)())act );
           setitimer (ITIMER_REAL, &rttimer, &old_rttimer);

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par untipy
    j'ai trouvé de la doc
    As tu un exemple stp ?
    Un autre exemple qui m'a servi pas plus tard qu'hier :

    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
     
           #include <sys/time.h> 
           #include <sys/types.h> 
           #include <unistd.h> 
     
           #define STDIN 0  /* Descripteur de fichier pour entrée standard */
     
           main()
           {
               struct timeval tv;
               fd_set readfds;
     
               tv.tv_sec = 2;
               tv.tv_usec = 500000;
     
               FD_ZERO(&readfds);
               FD_SET(STDIN, &readfds);
     
               /* ignorer writefds et exceptfds: */
               select(STDIN+1, &readfds, NULL, NULL, &tv);
     
               if (FD_ISSET(STDIN, &readfds))
                   printf("Une touche a été pressé !\n");
               else
                   printf("Timed out.\n");
           }
    Il attend 2.5 secondes qu'on appuie sur une touche.

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Zef14
    Un autre exemple qui m'a servi pas plus tard qu'hier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
           #include <sys/time.h> 
           #include <sys/types.h> 
           #include <unistd.h> 
     
           #define STDIN 0  /* Descripteur de fichier pour entrée standard */
    Huh ! POSIX.1 définit FILENO_STDIN...

  9. #9
    Nouveau membre du Club
    Inscrit en
    Novembre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 44
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Huh ! POSIX.1 définit FILENO_STDIN...
    C'est pas pour rejeter la faute sur quelqu'un d'autre, mais j'ai trouvé l'exemple ici.

    Même s'il est pas parfait il m'a permis de comprendre comment la fonction marche. Ca pourrait également le cas pour untipy.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    Merci de vos reponses.
    C'est bon j'ai solutionné mon pb

    bon week-end a tous

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

Discussions similaires

  1. Empiler et dépiler des processus sous Linux ? Comment gérer la pile ?
    Par Leschocolats dans le forum Administration système
    Réponses: 2
    Dernier message: 18/12/2008, 22h26
  2. PDA sous linux, comment procéder ?
    Par creusois dans le forum Mobiles
    Réponses: 0
    Dernier message: 22/04/2008, 12h34
  3. [tempo sous linux] comment stop timer ?
    Par untipy dans le forum Linux
    Réponses: 1
    Dernier message: 09/08/2007, 12h03
  4. [VB6] Comment Stopper un Timer ??
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 05/05/2006, 10h46
  5. MySQL sous linux comment s'y prendre?
    Par Doberman dans le forum Débuter
    Réponses: 4
    Dernier message: 10/01/2006, 12h58

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