Linux setitimer()有两个功能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个function,以下程序demo如何使用Linux setitimer()。
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
参数:
which为定时器类型 本例中用的是 ITIMER_REAL
ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。
value 是一个结构体 如下:
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
struct timeval {
long tv_sec;
long tv_usec;
};it_interval和it_value的区别结尾出有说明 tv_sec单位是秒 tv_usec单位是微妙
ovalue 一般设置成NULL
下面看一个例子:
/*
* timer.c
*
* Created on: 2012-8-28
* Author: zhenglq
*/
#include <signal.h> // signal()
#include <sys/time.h> // setitimer()
#include <unistd.h> // pause()
#include <stdio.h> // printf
#include <string.h> // for memset()
void printMSG(int num);
void printMSG(int num)
{
printf("hello,world!");
}
int main()
{
int res =0;
signal(SIGALRM,printMSG);
struct itimerval tick;
memset(&tick, 0, sizeof(tick));
tick.it_value.tv_sec = 5;
tick.it_value.tv_usec = 0;
tick.it_interval.tv_sec = 2;
tick.it_interval.tv_usec = 0;
res = setitimer(ITIMER_REAL,&tick,NULL);
//printf("res=%d\n",res);
if(res)
{
printf("setitimer failure!");
}
while(1)
{
pause();
printf("pause\n");
}
return 0;
}
这个例子网上搜下有很多,不过网上对结构体填充说的有点不够详细,自己写例子验证了下。
如果你要延长一段时间执行函数,那么你只要填充it_value就可以。如果你需要每隔一段时间执行一次it_value,那么你需要两个都填充。如果你只填充了it_interval是打印不出helloworld的。(在rhel5.4上面编译测试过了)。
还有一个问题是如果我把while(1)里的printf("pause\n");注释掉,编译,执行,“hello,world!”也打印不出来。这点不知道为什么会这样,如果谁知道请留言告知,感激万分