Linux定时器-select

3380阅读 0评论2018-07-17 qq526665621
分类:LINUX

Linux定时器-select

通过select函数实现linux高精度定时器

timeval的结构如下:
struct timeval{
  long tv_sec;/*secons*
  long tv_usec;/*microseconds*/
}

精确到microseconds也即微妙。

一、秒级定时器
void seconds_sleep(unsigned seconds){
    struct timeval tv;
    tv.tv_sec=seconds;
    tv.tv_usec=0;
    int err;
    do{
       err=select(0,NULL,NULL,NULL,&tv);
    }while(err<0 && errno==EINTR);
}


 二、毫秒级别定时器

void milliseconds_sleep(unsigned long mSec){

  struct timeval tv;
  tv.tv_sec=mSec/1000;
  tv.tv_usec=(mSec%1000)*1000;
  int err;
  do{
    err=select(0,NULL,NULL,NULL,&tv);
  }while(err<0 && errno==EINTR);
}


 三、微妙级别定时器

void microseconds_sleep(unsigned long uSec){
   struct timeval tv;
   tv.tv_sec=uSec/1000000;
   tv.tv_usec=uSec%1000000;
   int err;
   do{
     err=select(0,NULL,NULL,NULL,&tv);
   }while(err<0 && errno==EINTR);
}


注:timeval结构体中虽然指定了一个微妙级别的分辨率,但内核支持的分别率往往没有这么高,很多unix内核将超时值向上舍入成10ms的倍数。此外,加上内核调度延时现象,即定时器时间到后,内核还需要花一定时间调度相应进程的运行。因此,定时器的精度,最终还是由内核支持的分别率决定。


上一篇:Linux驱动(五) 物理地址映射-gpio
下一篇:OpenWrt学习(一)----Makefile-编译动态库