Linux下实现定时器Timer的几种方法总结

Linux下实现定时器Timer的几种方法总结

下面总结几种在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定时器的所有方法的总结。希望大家多多支持~

Linux下实现定时器Timer的几种方法总结