Linux下的定时器有两种,以下分别介绍:
  
   1、alarm
  
   如果不要求很精确的话,用alarm()和signal()就够了
  
   unsigned int alarm(unsigned int seconds)
  
   函数说明: alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。
  
   返回值: 返回之前闹钟的剩余秒数,如果之前未设闹钟则返回0.
  
   alarm()执行后,进程将继续执行,在后期(alarm以后)的执行过程中将会在seconds秒后收到信号SIGALRM并执行其处理函数。
  
    
| #include <stdio.h> #include <time.h> #include <sys/time.h> #include <stdlib.h> #include <signal.h> 
 void sigalrm_fn(int sig) { printf("alarm!\n"); alarm(2); return; } 
 int main(void) { signal(SIGALRM, sigalrm_fn); alarm(1); while(1) pause(); } | 
| 
 | 
   2、setitimer()
   int setitimer(int which, const struct itimerval *value, struct itimerval*ovalue));
   setitimer()比alarm功能强大,支持3种类型的定时器:
   ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。
   ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
   ITIMER_PROF : 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。
   setitimer()第一个参数which指定定时器类型(上面三种之一);第二个参数是结构itimerval的一个实例;第三个参数可不做处理。
   setitimer()调用成功返回0,否则返回-1.
   下面是关于setitimer调用的一个简单示范,在该例子中,每隔一秒发出一个SIGALRM,每隔0.5秒发出一个SIGVTALRM信号:
  
    
| #include <stdio.h> #include <time.h> #include <sys/time.h> #include <stdlib.h> #include <signal.h> 
 int sec; 
 void sigroutine(int signo){ 
 switch (signo){ 
 case SIGALRM: 
 printf("Catch a signal -- SIGALRM \n"); 
 signal(SIGALRM, sigroutine); 
 break; 
 case SIGVTALRM: 
 printf("Catch a signal -- SIGVTALRM \n"); 
 signal(SIGVTALRM, sigroutine); 
 break; 
 } 
 return; 
 } 
 int main() 
 { 
 struct itimerval value, ovalue, value2; //(1) 
 sec = 5; 
 printf("process id is %d\n", getpid()); 
 signal(SIGALRM, sigroutine); 
 signal(SIGVTALRM, sigroutine); 
 value.it_value.tv_sec = 1; 
 value.it_value.tv_usec = 0; 
 value.it_interval.tv_sec = 1; 
 value.it_interval.tv_usec = 0; 
 setitimer(ITIMER_REAL, &value, &ovalue); //(2) 
 value2.it_value.tv_sec = 0; 
 value2.it_value.tv_usec = 500000; 
 value2.it_interval.tv_sec = 0; 
 value2.it_interval.tv_usec = 500000; 
 setitimer(ITIMER_VIRTUAL, &value2, &ovalue); 
 for(;;) 
 ; 
 } |