linux 定时函数setitimer使用
#include
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
第一个参数:which表示类型:
ITIMER_REAL:以系统真实的时间来计算,计时到期后发出SIGALRM信号。
ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,计时到期后发出SIGVTALRM信号。
ITIMER_PROF:以该进程在用户态下和内核态下所费的时间来计算。计时到期后发出SIGPROF信号。
第二个参数:new_value用来对计时器进行延时设置,it_interval为计时间隔,it_value为延时时长。
第三个参数:old_value通常设置为NULL,用来存储上一次setitimer调用时设置的new_value值。
返回值:成功返回0, 失败返回-1。
itimerval结构体
struct itimerval
{
struct timeval it_interval;
struct timeval it_value;
};
struct timeval
{
time_t tv_sec;
suseconds_t tv_usec;
};
settimer工作机制是,先对it_value倒计时,当it_value为零时会触发信号,然后重置为it_interval,继续对it_value倒计时。一直这样循环下去。
基于此机制。setitimer既能够用来延时运行,也可定时运行。
注意:如果将it_value设置为0将不会触发信号,而it_interval为0则不会定时。
#include
#include
#include
#include
#define COUNT_SEC 1
#define COUNT_USEC 0
static void Timer_Test(int sig)
{
printf("This is a Test
");
}
static void Init_timer(struct itimerval *tick)
{
int ret;
memset(tick, 0, sizeof(struct itimerval));
tick->it_value.tv_sec = COUNT_SEC;
tick->it_value.tv_usec = COUNT_USEC;
tick->it_interval.tv_sec = COUNT_SEC;
tick->it_interval.tv_usec = COUNT_USEC;
return;
}
int main(int argc, const char * argv [])
{
int ret = 0;
struct itimerval tick;
signal(SIGALRM, Timer_Test);
Init_timer(&tick);
ret = setitimer(ITIMER_REAL, &tick, NULL);
if(ret < 0)
{
perror("setitimer");
return -1;
}
for (;;);
return 0;
}