linux闹钟alarm

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值