linux系统中定时器使用方法,Linux下实现定时器Timer的几种方法
使用sleep()和usleep()
其中sleep精度是1秒,usleep精度是1微妙,具體代碼就不寫了。使用這種方法缺點比較明顯,在Linux系統中,sleep類函數不能保證精度,尤其在系統負載比較大時,sleep一般都會有超時現象。
使用信號量SIGALRM + alarm()
這種方式的精度能達到1秒,其中利用了*nix系統的信號量機制,首先注冊信號量SIGALRM處理函數,調用alarm(),設置定時長度,代碼如下:
#include
#include
void timer(int sig)
{
if(SIGALRM == sig)
{
printf("timer\n");
alarm(1); //we contimue set the timer
}
return ;
}
int main()
{
signal(SIGALRM, timer); //relate the signal and function
alarm(1); //trigger the timer
getchar();
return 0;
}
alarm方式雖然很好,但是無法首先低于1秒的精度。
使用RTC機制
RTC機制利用系統硬件提供的Real Time Clock機制,通過讀取RTC硬件/dev/rtc,通過ioctl()設置RTC頻率,代碼如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char* argv[])
{
unsigned long i = 0;
unsigned long data = 0;
int retval = 0;
int fd = open ("/dev/rtc", O_RDONLY);
if(fd < 0)
{
perror("open");
exit(errno);
}
/*Set the freq as 4Hz*/
if(ioctl(fd, RTC_IRQP_SET, 1) < 0)
{
perror("ioctl(RTC_IRQP_SET)");
close(fd);
exit(errno);
}
/* Enable periodic interrupts */
if(ioctl(fd, RTC_PIE_ON, 0) < 0)
{
perror("ioctl(RTC_PIE_ON)");
close(fd);
exit(errno);
}
for(i = 0; i < 100; i++)
{
if(read(fd, &data, sizeof(unsigned long)) < 0)
{
perror("read");
close(fd);
exit(errno);
}
printf("timer\n");
}
/* Disable periodic interrupts */
ioctl(fd, RTC_PIE_OFF, 0);
close(fd);
return 0;
}
這種方式比較方便,利用了系統硬件提供的RTC,精度可調,而且非常高。
使用select()
通過使用select(),來設置定時器;原理利用select()方法的第5個參數,第一個參數設置為0,三個文件描述符集都設置為NULL,第5個參數為時間結構體,代碼如下:
#include
#include
#include
#include
/*seconds: the seconds; mseconds: the micro seconds*/
void setTimer(int seconds, int mseconds)
{
struct timeval temp;
temp.tv_sec = seconds;
temp.tv_usec = mseconds;
select(0, NULL, NULL, NULL, &temp);
printf("timer\n");
return ;
}
int main()
{
int i;
for(i = 0 ; i < 100; i++)
setTimer(1, 0);
return 0;
}
總結:如果對系統要求比較低,可以考慮使用簡單的sleep(),畢竟一行代碼就能解決;如果系統對精度要求比較高,則可以考慮RTC機制和select()機制。
總結
以上是生活随笔為你收集整理的linux系统中定时器使用方法,Linux下实现定时器Timer的几种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux:进程占用的端口,在linux
- 下一篇: linux运行geoserver源码,L