现在的位置: 首页 > 综合 > 正文

Linux两种定时器

2012年10月21日 ⁄ 综合 ⁄ 共 1766字 ⁄ 字号 评论关闭

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(;;)

 

;

 

}

抱歉!评论已关闭.