2010-09-02 59 views
0

我有下面的代码,我希望等待2秒,然后等待5秒循环。帮助setitimer /信号问题

有一个原因,我没有使用it_interval来重新定时器。

#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); 
    } 
} 

它产生以下输出

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 

我不能工作了为什么它不等待5秒,第二定时器。

任何想法?

THX M.

回答

1

啊哈!修复。

sem_wait正在中断,并返回-1errno == EINTR所以我必须有这样的事情。

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