Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69014
  • 博文数量: 13
  • 博客积分: 197
  • 博客等级: 入伍新兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-22 17:54
文章分类

全部博文(13)

文章存档

2011年(13)

分类: LINUX

2011-04-28 17:57:10

最简单的定时器是alarm(),使用这个函数需要引入头文件,它的定义如下:

unsigned int alarm(unsigned int seconds);

调用这个函数后,会在seconds秒后,向进程发送一个SIGALRM信号。这个定时器精度不高,适用于对精度要求不高的场合。

对精度有要求的场合,应当使用setitimer()。

setitimer()是一个间歇定时器,由头文件引入,它的定义为:

int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue)

 

参数which是设定定时器的工作方式,它由如下几个值来决定工作方式:

ITIMER_REAL  测量真实时间。时间到了以后,内核发送SIGALRM给进程。

ITIMER_VIRTUAL 定时器在进程执行用户空间代码的时候时间才会减少。指定的进程时间耗尽以后,内核发送SIGVTALRM给进程。

ITIMER_PROF  定时器的时间只有在进程执行和内核为进程服务的时候才会减少,指定的时间过去以后,内核发送SIGPROF给进程。

value是一个指向结构itimerval的指针,itimerval的定义如下:

struct itimerval{

          struct timeval it_interval;

          struct timeval it_value;

};

timeval是一个提供微秒级精度的结构体。settimer()会设置一个市场为it_value时长的定时器。一旦时间结束,则内核会使用it_interval所指定的时长重启定时器。如果it_value到达0且it_interval设置为0,则内核不重启定时器。

当ovalue的值不为NULL时,会返回which类型的间歇定时器的前一个值。

函数执行成功返回0,否则返回-1,并且设置errno。

一个利用setitimer()设定定时器的函数示例:

 

  1. //设定一个精度为微秒的定时器
  2. int set_alarm(int milliseconds) {
  3.     struct itimerval t;
  4.     t.it_value.tv_sec = milliseconds / 1000;
  5.     t.it_value.tv_usec = milliseconds % 1000 * 1000;
  6.     t.it_interval.tv_sec = 0;
  7.     t.it_interval.tv_usec = 0;
  8.     return setitimer(ITIMER_REAL, &t, NULL);
  9. }
阅读(1726) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~