Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1819433
  • 博文数量: 496
  • 博客积分: 12043
  • 博客等级: 上将
  • 技术积分: 4778
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-27 14:26
文章分类

全部博文(496)

文章存档

2014年(8)

2013年(4)

2012年(181)

2011年(303)

2010年(3)

分类: LINUX

2011-12-20 16:57:42

目录




setitimer函数功能介绍  
在linux下如果定时如果要求不太精确的话,使用alarm()和signal()就行了,但是如果想要实现精度较高的定时功能的话,就要使用setitimer函数。

setitimer函数参数介绍  
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));   
which为定时器类型,setitimer支持3种类型的定时器:   
   ITIMER_REAL
: 以系统真实的时间来计算,它送出SIGALRM信号。   
   ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。   
   ITIMER_PROF : 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。   setitimer()第一个参数which指定定时器类型(上面三种之一);第二个参数是结构itimerval的一个实例;第三个参数可不做处理。   setitimer()调用成功返回0,否则返回-1。   
struct itimerval {   
    struct timeval it_interval;   
    struct timeval it_value;   
};   

struct timeval {   
    long tv_sec;   
    long tv_usec;   
};   
it_interval指定间隔时间,it_value指定初始定时时间。如果只指定 it_value,就是实现一次定时;如果同时指定 it_interval,则超时后,系统会重新初始化it_value为it_interval,实现重复定时;两者都清零,则会清除定时器。   
tv_sec提供秒级精度,tv_usec提供微秒级精度,以值大的为先,注意1s = 1000000us。   
ovalue用来保存先前的值,常设为NULL。   
如果是以setitimer提供的定时器来休眠,只需阻塞等待定时器信号就可以了。利用setitimer范例  在该例子中,每隔一秒发出一个SIGALRM,每隔0.5秒发出一个SIGVTALRM信号:   
#include   
#include   
#include   
#include   
#include   
#include   
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(;;)   
      ;   
}
阅读(1489) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~