提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、定时器alarm和定时器setitimer
alarm
使用a l a r m函数可以设置一个时间值(闹钟时间),在将来的某个时刻该时间值会被超过。当所设置的时间值被超过后,产生 S I G A L R M信号。如果不忽略或不捕捉此信号,则其默认动作是终止该进程。
unsigned int alarm(unsigned int seconds) ;
其中,参数s e c o n d s的值是秒数,经过了指定的s e c o n d s秒后会产生信号S I G A L R M。要了解的是,经过了指定秒后,信号由内核产生,由于进程调度的延迟,进程得到控制能够处理该信号还需一段时间。
setitimer
设置定时器(闹钟)。可以替代alarm函数。精度微秒us,可以实现周期性定时。
int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);
参数:
which:定时器以什么时间计时
ITIMER_REAL:真实时间,时间到达,发送SIGALARM 常用
ITIMER_VIRTUAL:用户实际,实际到达,发送SIGVTALRM
ITIMER_PROF:以该进程在用户态和内核态下所消耗的时间来计算,时间到达,发送SIGPROF
-new_value:设置定时器的属性
-old_value:记录上一次定时的时间参数,一般不使用,NULL
二、alarm的案例
#include<stdio.h>
#include<unistd.h>
int main()
{
int seconds = alarm(5);
printf("seconds = %d\n",seconds);
sleep(2);
seconds = alarm(2);//不阻塞
printf("seconds = %d\n",seconds);
while(1)
{
}
return 0;
}
三、setitimer的案例
#include<stdio.h>
#include<stdlib.h>
#include <sys/time.h>
//过三秒以后,每隔2秒定时一次
int main()
{
struct itimerval new_value;
//设置间隔的时间
new_value.it_interval.tv_sec=2;
new_value.it_interval.tv_usec=0;
//设置延迟的时间,3秒之后开始第一次定时
new_value.it_value.tv_sec=3;
new_value.it_value.tv_usec=0;
int ret = setitimer(ITIMER_REAL,&new_value,NULL);//非阻塞
printf("定时器开始了。。。\n");
if(ret==-1)
{
perror("setitimer");
exit(0);
}
getchar();
return 0;
}
总结
今天主要给大家介绍了Linux的2种定时器,alarm主要是设置时间然后到达时间之后开始执行,setitimer主要是先设置延迟时间,然后到达延迟时间后,没间隔多少时间执行一次。