2010-09-02 4 views
0

J'ai le code suivant que j'espérerais attendre 2 secondes, puis attendre 5 secondes dans une boucle.aide avec le problème setitimer/signal

Il y a une raison pour laquelle je n'utilise pas le it_interval pour refaire le timer.

#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <unistd.h> 
#include <signal.h> 
#include <time.h> 
#include <sys/time.h> 

#include <semaphore.h> 

sem_t sem; 

void sighdlr(int sig) 
{ 
    printf("sighdlr\n"); 
    sem_post(&sem); 
} 

int main(int c, char *v[]) 
{ 
    signal(SIGALRM, sighdlr); 

    struct itimerval itv; 
    struct tm tm; 
    time_t now; 

    while(true) 
    { 
     itv.it_value.tv_sec = 2; 
     itv.it_value.tv_usec = 0; 
     itv.it_interval.tv_sec = 0; 
     itv.it_interval.tv_usec = 0; 
     setitimer(ITIMER_REAL, &itv, NULL); 

     sem_wait(&sem); 
     now = time(NULL); 
     localtime_r(&now, &tm); 
     fprintf(stderr, "%02d:%02d:%02d\n", tm.tm_hour, tm.tm_min, tm.tm_sec); 

     itv.it_value.tv_sec = 5; 
     itv.it_value.tv_usec = 0; 
     itv.it_interval.tv_sec = 0; 
     itv.it_interval.tv_usec = 0; 
     setitimer(ITIMER_REAL, &itv, NULL); 

     sem_wait(&sem); 
     now = time(NULL); 
     localtime_r(&now, &tm); 
     fprintf(stderr, "%02d:%02d:%02d\n", tm.tm_hour, tm.tm_min, tm.tm_sec); 
    } 
} 

Il produit la sortie suivante

sighdlr 
15:32:50 
15:32:50 
sighdlr 
15:32:52 
15:32:52 
sighdlr 
15:32:54 
15:32:54 
sighdlr 
15:32:56 
15:32:56 
sighdlr 
15:32:58 
15:32:58 
sighdlr 
15:33:00 
15:33:00 

Je ne peux pas comprendre pourquoi il n'attend pas les 5 secondes pour la deuxième minuterie.

Des idées?

Thx M.

Répondre

1

Aha! l'a réparé. Le sem_wait a été interrompu et renvoyé -1 et errno == EINTR alors je dois avoir quelque chose comme ça.

do { 
    ret = sem_wait(&sem); 
} while(ret < 0 && errno == EINTR);