Chinaunix首页 | 论坛 | 博客
  • 博客访问: 299495
  • 博文数量: 52
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 587
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-09 09:24
个人简介

水滴

文章分类

全部博文(52)

文章存档

2021年(3)

2019年(8)

2018年(32)

2017年(9)

我的朋友

分类: LINUX

2018-07-17 08:49:48

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的倍数。此外,加上内核调度延时现象,即定时器时间到后,内核还需要花一定时间调度相应进程的运行。因此,定时器的精度,最终还是由内核支持的分别率决定。


阅读(3296) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~