Linux 定时器编程
Linux 定时器编程
一、Linux应用程序定时器
用到的数据结构为:
struct itimerval {
struct timeval it_interval; /* next value */
struct timeval it_value; /* current value */
};
其中it_value用于设置第一次定时器到达并发送信号的时间,it_interval用于设置定时器终止后的重设值.若为0则定时器在终止后将失效;若不为0,则定时器终止后,将会以该值进行重新定时。
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);
设置定时器间隔,其中第一个变量which的取值如下:
ITIMER_REAL :以系统真实的时间来计算,它送出SIGALRM信号。
ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
ITIMER_PROF :以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信
号。
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
该函数用于设置某一信号的对应处理函数,对定时器来说信号有:SIGALRM、SIGVTALRM、SIGPROF; handler用于设置某一信号到来时的处理函数。所在头文件signal.h
下面是示例程序
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
/*设置定时器到达时间*/
#define REFRESH_TIME 10
/*设置定时器*/
void set_refresh_time(int sec)
{
struct itimerval nvalue;
nvalue.it_value.tv_sec = sec;
nvalue.it_value.tv_usec = 0;
nvalue.it_interval.tv_sec = sec;//每隔sec时间触发一次定时器
nvalue.it_interval.tv_usec = 0;
/*此处使用的是ITIMER_REAL,所以对应的是SIGALRM信号*/
setitimer(ITIMER_REAL, &nvalue, NULL);
}
/*定时器处理函数*/
void timer_handler(int msg)
{
switch(msg)
{
case SIGALRM:
printf("to do someting when set timer is comming\n");
break;
default:
break;
}
return ;
}
int main(int argc, char **argv)
{
int value;
/*设置SIGALRM信号的处理函数,即定时器处理函数*/
signal(SIGALRM, timer_handler);
if(!argv[1])
{
Printf("use default time %d\n", REFRESH_TIME);
/*设置定时器*/
set_refresh_time(REFRESH_TIME);
}
else
{
value = atoi(argv[1]);
set_refresh_time(value);
}
while(1)
{
}
}
|
评论暂时关闭