linux内部的alarm是通过设定参数long sec的指进行设定内核态的时间 每次相隔当前系统时间的下一次的时间到达之后内部的计数器会进行加一 然后返回SIGALRM 信号 一般我们所用的是linux的setitimer和getitimer 因为这种方式的时间选择多样性有三种模式ITIMER_REAL ITIMER_PROF ITIMER_VIRTUAL 三种模式 第一种是反馈系统得真实时间 是递减的返回SIGALRM 第二种是反馈用户态和内核态的综合时间返回SIGPROFR 第三种是内核态的时间返回SIGVTALRM 上述三种mode全部用在第一个参数 int which让用户层获取三种类型的时间点 不过这三种模式一般不分彼此 全部都通用
#include <sys/time.h>
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>
int main(void)
{
struct itimerval setvalue;
setvalue.it_interval.tv_sec=3;
setvalue.it_interval.tv_usec=0;
setvalue.it_value.tv_sec=3;
setvalue.it_value.tv_usec=0;
setitimer(ITIMER_REAL,&setvalue,NULL);
setvalue.it_interval.tv_sec=3;
setvalue.it_interval.tv_usec=0;
setvalue.it_value.tv_sec=3;
setvalue.it_value.tv_usec=0;
setitimer(ITIMER_VIRTUAL,&setvalue,NULL);
setvalue.it_interval.tv_sec=3;
setvalue.it_interval.tv_usec=0;
setvalue.it_value.tv_sec=1;
setvalue.it_value.tv_usec=0;
setitimer(ITIMER_PROF,&setvalue,NULL);
while(1)
{
struct itimerval value;
getitimer(ITIMER_REAL,&value);
printf("ITIMER_REAL: internal:%ds%dms,remain:%ds%dms\n",value.it_interval.tv_sec,value.it_interval.tv_usec,value.it_value.tv_sec,value.it_value.tv_usec);
getitimer(ITIMER_VIRTUAL,&value);
printf("ITIMER_VIRTUAL:internal:%ds%dms,remain:%ds%dms\n",value.it_interval.tv_sec,value.it_interval.tv_usec,value.it_value.tv_sec,value.it_value.tv_usec);
getitimer(ITIMER_PROF,&value);
printf("ITIMER_PROF: internal:%ds%dms,remain:%ds%dms\n\n",value.it_interval.tv_sec,value.it_interval.tv_usec,value.it_value.tv_sec,value.it_value.tv_usec);
sleep(1);
}
}
返回的测试值
ITIMER_REAL: internal:3s0ms,remain:2s999991ms
ITIMER_VIRTUAL:internal:3s0ms,remain:3s4000ms
ITIMER_PROF: internal:3s0ms,remain:1s4000ms
ITIMER_REAL: internal:3s0ms,remain:1s997866ms
ITIMER_VIRTUAL:internal:3s0ms,remain:3s4000ms
ITIMER_PROF: internal:3s0ms,remain:1s4000ms
ITIMER_REAL: internal:3s0ms,remain:0s996840ms
ITIMER_VIRTUAL:internal:3s0ms,remain:3s4000ms
ITIMER_PROF: internal:3s0ms,remain:1s4000ms