下面总结几种在Linux下实现Timer的方法。我觉得边肖挺好的。我现在就分享给你,给你一个参考。来和边肖一起看看吧。
定时器的应用场景非常广泛。在Linux下,有以下方法:
1,使用sleep()和usleep()
sleep的精度是1秒,usleep的精度是1微妙,具体代码就不写了。使用这种方法的缺点很明显。在Linux系统中,睡眠功能无法保证准确性,尤其是系统负载较重时,睡眠通常会出现超时现象。
2,使用信号量SIGALRM + alarm()
这种方法的精度可以达到1秒,其中使用了*nix系统的信号量机制。首先注册信号量SIGALRM处理函数,调用alarm(),设置计时长度。代码如下:
#包含stdio.h
#包含信号. h
无效定时器(int sig)
{
if(SIGALRM==sig)
{
printf(' timer \ n ');
报警(1);//我们继续设置计时器
}
返回;
}
int main()
{
信号(SIGALRM,定时器);//将信号和功能联系起来
报警(1);//触发定时器
getchar();
返回0;
}
报警方式虽然很好,但首先准确度不能低于1秒。
3,使用RTC机制
RTC机制使用系统硬件提供的实时时钟机制,通过ioctl()读取RTC hardware /dev/rtc来设置RTC频率。代码如下:
#包含stdio.h
#包含linux/rtc.h
#包含sys/ioctl.h
#包含系统/时间. h
#包含sys/types.h
#包含fcntl.h
#包括unistd.h
#包含错误号h
#包含stdlib.h
int main(int argc,char* argv[])
{
无符号长整型I=0;
无符号长数据=0;
int retval=0;
int fd=open ('/dev/rtc ',O _ RDONLY);
如果(fd 0)
{
perror(‘开’);
退出(errno);
}
/*将频率设置为4Hz*/
if(ioctl(fd,RTC_IRQP_SET,1) 0)
{
perror(' ioctl(RTC _ IRQP _ SET)');
关闭(FD);
退出(errno);
}
/*启用周期性中断*/
if(ioctl(fd,RTC_PIE_ON,0) 0)
{
perror(' ioctl(RTC _ PIE _ ON)');
关闭(FD);
退出(errno);
}
for(I=0;i 100我)
{
if(read(fd,data,sizeof(无符号长整型))0)
{
perror(‘读’);
关闭(FD);
退出(errno);
}
printf(' timer \ n ');
}
/*禁用周期性中断*/
ioctl(fd,RTC_PIE_OFF,0);
关闭(FD);
返回0;
}
该方法使用方便,利用系统硬件提供的RTC,精度可调,具有很高的准确度。
4,使用select()
这个方法是在看阿普的神书的时候看到的,比较冷门。通过使用select(),定时器被设置。该原则使用select()方法的第五个参数。第一个参数设置为0,所有三个文件描述符设置为NULL,第五个参数是一个时间结构,代码如下:
#包含系统/时间. h
#包含系统/选择. h
#包含时间. h
#包含stdio.h
/*秒:秒;毫秒:微秒*/
void setTimer(整数秒,整数毫秒)
{
结构时间值温度;
temp.tv_sec=秒;
temp.tv _ usec=mseconds
select(0,NULL,NULL,NULL,temp);
printf(' timer \ n ');
返回;
}
int main()
{
int I;
for(I=0;i 100我)
setTimer(1,0);
返回0;
}
这种方法的准确度可以达到一种微妙的程度。网上有很多基于select()的多线程定时器,可见select()还是很稳定的。
总结:如果系统要求比较低,可以考虑使用简单睡眠()。毕竟一行代码就能解决;如果系统要求精度高,可以考虑RTC机制和select()机制。
以上就是边肖带来的在Linux下实现Timer定时器的所有方法的总结。希望大家多多支持~
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。