2010-09-02 64 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);