Linux 定时器setitimer()

来源:互联网 发布:5.48数据库 编辑:程序博客网 时间:2024/05/21 13:34

用法:
#include <sys/time.h>

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

 

功能描述:
获取或设定间歇计时器的值。系统为进程提供三种类型的计时器,每一类以不同的时间域递减其值。当计时器超时,信号被发送到进程,之后计时器重启动。

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

ITIMER_REAL //数值为0,以系统真实的时间来计算,发送的信号是SIGALRM。
ITIMER_VIRTUAL//数值为1,以该进程在用户态下花费的时间来计算,发送的信号是SIGVTALRM。
ITIMER_PROF //数值为2,以该进程在用户态下和内核态下所费的时间来计算,发送的信号是SIGPROF。

 

value,ovalue:时间参数,原型如下

struct itimerval {
   struct timeval it_interval;
   struct timevalit_value;   
};

struct timeval {
   longtv_sec;               
   longtv_usec;              
};

   itimerval结构中的it_value是减少的时间,当这个值为0的时候就发出相应的信号了.然后再将it_value设置为it_interval值.也就是先处理it_value中设置的值,为0后发送信号(根据which来判断发送什么信号),之后都是根据it_interval的值发送信号。若it_value为0,就没有相应的信号产生了。

struct timeval结构体在time.h中的定义为:
struct timeval
{
__time_ttv_sec;      
__suseconds_ttv_usec;   
};
其中,tv_sec为Epoch到创建structtimeval时的秒数,tv_usec为微秒数,即秒后面的零头。比如当前我写博文时的tv_sec为1244770435,tv_usec为442388,即当前时间距Epoch时间1244770435秒,442388微秒。需要注意的是,因为循环过程,新建结构体变量等过程需消耗部分时间,我们作下面的运算时会得到如下结果:
int i;
for (i = 0; i < 4; ++i)
{
gettimeofday(&tv, NULL);
printf("%dt%dn", tv.tv_usec, tv.tv_sec);
sleep(1);
}
442388   1244770435
443119   1244770436
443543   1244770437
444153   1244770438
前面为微秒数,后面为秒数,可以看出,在这个简单运算中,只能精确到小数点后面一到两位,或者可以看出,每进行一次循环,均需花费0.005秒的时间,用这个程序来作计时器显然是不行的,除非精确计算产生的代码消耗时间。

 

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


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

 

例子:
void sigroutine(int signo)
{
 static int count1=0,count2=0;

 switch (signo)
 {
 case SIGALRM:
  count1++;
  printf("Catch asignal -- SIGALRM n");
  printf("count1 =%dnn", count1);
  signal(SIGALRM,sigroutine);
  break;
 case SIGVTALRM:
  count2++;
  printf("Catch asignal -- SIGVTALRM n");
  printf("count2 =%dnn", count2);
  signal(SIGVTALRM,sigroutine);
  break;
 }
 return;
}

 

int main()
{
 struct itimerval value, ovalue,value2;
 printf("process id is %dn",getpid());

 signal(SIGALRM, sigroutine);
 signal(SIGVTALRM, sigroutine);

 

 value.it_value.tv_sec = 2;
 value.it_value.tv_usec = 0;
 value.it_interval.tv_sec = 3;
 value.it_interval.tv_usec = 0;
 setitimer(ITIMER_REAL,&value, &ovalue);

 

 value2.it_value.tv_sec = 1;
 value2.it_value.tv_usec = 0;
 value2.it_interval.tv_sec = 3;
 value2.it_interval.tv_usec = 0;
 setitimer(ITIMER_VIRTUAL,&value2, &ovalue);

 

 while(1);
}


原创粉丝点击