http://blog.sina.com.cn/s/blog_590be5290100izdf.html
用法:
#include <sys/time.h>
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct
itimerval *ovalue);
功能描述:
获取或设定间歇计时器的值。系统为进程提供三种类型的计时器,每一类以不同的时间域递减其值。当计时器超时,信号被发送到进程,之后计时器重启动。
参数:
which:间歇计时器类型,有三种选择
ITIMER_REAL //数值为0,以系统真实的时间来计算,发送的信号是SIGALRM。
ITIMER_VIRTUAL //数值为1,以该进程在用户态下花费的时间来计算,发送的信号是SIGVTALRM。
ITIMER_PROF //数值为2, 以该进程在用户态下和内核态下所费的时间来计算,发送的信号是SIGPROF。
value,ovalue:时间参数,原型如下
struct itimerval {
struct
timeval it_interval;
struct
timeval
it_value;
};
struct timeval {
long
tv_sec;
long
tv_usec;
};
itimerval结构中的it_value是减少的时间,当这个值为0的时候就发出相应的信号了.
然后再将it_value设置为it_interval值.
也就是先处理it_value中设置的值,为0后发送信号(根据which来判断发送什么信号),之后都是根据it_interval的值发送信号。若
it_value为0,就没有相应的信号产生了。
getitimer()用计时器的当前值填写value指向的结构体。
setitimer()将 value 指向的结构体设为计时器的当前值,如果ovalue不是NULL,将返回计时器原有值。
返回说明:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EFAULT:value 或ovalue是不有效的指针
EINVAL:其值不是ITIMER_REAL,ITIMER_VIRTUAL 或 ITIMER_PROF之一
例子:
1 void sigroutine(int signo) 2 { 3 static int count1=0,count2=0; 4 5 switch (signo) 6 { 7 case SIGALRM: 8 count1++; 9 printf("Catch a signal -- SIGALRM \n"); 10 printf("count1 = %d\n\n", count1); 11 signal(SIGALRM, sigroutine); 12 break; 13 case SIGVTALRM: 14 count2++; 15 printf("Catch a signal -- SIGVTALRM \n"); 16 printf("count2 = %d\n\n", count2); 17 signal(SIGVTALRM, sigroutine); 18 break; 19 } 20 return; 21 } 22 23 24 25 int main() 26 { 27 struct itimerval value, ovalue, value2; 28 printf("process id is %d\n", getpid()); 29 30 signal(SIGALRM, sigroutine); 31 signal(SIGVTALRM, sigroutine); 32 33 34 35 value.it_value.tv_sec = 2; 36 value.it_value.tv_usec = 0; 37 value.it_interval.tv_sec = 3; 38 value.it_interval.tv_usec = 0; 39 setitimer(ITIMER_REAL, &value, &ovalue); 40 41 42 43 value2.it_value.tv_sec = 1; 44 value2.it_value.tv_usec = 0; 45 value2.it_interval.tv_sec = 3; 46 value2.it_interval.tv_usec = 0; 47 setitimer(ITIMER_VIRTUAL, &value2, &ovalue); 48 49 50 51 while(1); 52 }
【转】Linux 定时器setitimer(),布布扣,bubuko.com