Linux struct itimerval用法

来源:互联网 发布:网络安全教育讲话稿 编辑:程序博客网 时间:2024/05/01 07:15

http://blog.csdn.net/hbuxiaofei/article/details/35569229



先看一段代码

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2. #include <time.h>  
  3. #include <sys/time.h>  
  4. #include <stdlib.h>  
  5. #include <signal.h>  
  6.   
  7.   
  8. static int count = 0;  
  9.   
  10.   
  11. void set_timer()  
  12. {  
  13.     struct itimerval itv;  
  14.   
  15.   
  16.     itv.it_value.tv_sec = 3;    //timer start after 3 seconds later  
  17.     itv.it_value.tv_usec = 0;  
  18.   
  19.   
  20.     itv.it_interval.tv_sec = 1;  
  21.     itv.it_interval.tv_usec = 0;  
  22.   
  23.   
  24.     setitimer(ITIMER_REAL,&itv,NULL);  
  25. }  
  26.   
  27.   
  28. void signal_handler(int m)  
  29. {  
  30.     count ++;  
  31.     printf("%d\n",count);  
  32. }  
  33.   
  34.   
  35. int main()  
  36. {  
  37.     signal(SIGALRM,signal_handler);  
  38.     set_timer();  
  39.     while(count < 10);  
  40.     exit(0);  
  41.     return 0;  
  42.   
  43. }  

这段代码实现的功能:3秒钟后启动定时器,然后每隔1秒钟向终端打印count的递增值,当count到10时程序退出。

结构体原型:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. struct itimerval {  
  2.                 struct timeval it_interval; /* next value */  
  3.                 struct timeval it_value;    /* current value */  
  4.             };  
[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1.   
[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. struct timeval {  
  2.                 long tv_sec;                /* seconds */  
  3.                 long tv_usec;               /* microseconds */  
  4.             };  
即:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. struct itimerval {  
  2.     struct timeval it_interval; /* 计时器重启动的间歇值 */  
  3.     struct timeval it_value;    /* 计时器安装后首先启动的初始值 */  
  4. };  
  5.   
  6. struct timeval {  
  7.     long tv_sec;                /* 秒 */  
  8.     long tv_usec;               /* 微妙(1/1000000) */  
  9. };  

再来看这个函数:

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

setitimer()将value指向的结构体设为计时器的当前值,如果ovalue不是NULL,将返回计时器原有值。

which:间歇计时器类型,有三种选择

ITIMER_REAL      //数值为0,计时器的值实时递减,发送的信号是SIGALRM。
ITIMER_VIRTUAL //数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM。
ITIMER_PROF     //数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。

返回说明: 
成功执行时,返回0。失败返回-1,errno被设为以下的某个值 
EFAULT:value或ovalue是不有效的指针
EINVAL:其值不是ITIMER_REAL,ITIMER_VIRTUAL 或 ITIMER_PROF之一


0 0
原创粉丝点击