Linux下實現定時器Timer的幾種方法

2021-08-06 01:57:07 字數 1840 閱讀 9299

定時器timer應用場景非常廣泛,在linux下,有以下幾種方法:

1,使用sleep()和usleep()

其中sleep精度是1秒,usleep精度是1微妙,具體**就不寫了。使用這種方法缺點比較明顯,在linux系統中,sleep類函式不能保證精度,尤其在系統負載比較大時,sleep一般都會有超時現象。

2,使用訊號量sigalrm + alarm()

這種方式的精度能達到1秒,其中利用了*nix系統的訊號量機制,首先註冊訊號量sigalrm處理函式,呼叫alarm(),設定定時長度,**如下:

[cpp]view plain

copy

#include 

#include 

void

timer(

intsig)  

return

;  }  

intmain()    

alarm方式雖然很好,但是無法首先低於1秒的精度。

3,使用rtc機制

rtc機制利用系統硬體提供的real time clock機制,通過讀取rtc硬體/dev/rtc,通過ioctl()設定rtc頻率,**如下:

[cpp]view plain

copy

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

intmain(

intargc, 

char

* argv)  

/*set the freq as 4hz*/

if(ioctl(fd, rtc_irqp_set, 1) < 0)  

/* enable periodic interrupts */

if(ioctl(fd, rtc_pie_on, 0) < 0)  

for(i = 0; i < 100; i++)  

printf("timer\n"

);  

}  /* disable periodic interrupts */

ioctl(fd, rtc_pie_off, 0);  

close(fd);  

return

0;  

}  

這種方式比較方便,利用了系統硬體提供的rtc,精度可調,而且非常高。

4,使用select()

這種方法在看apue神書時候看到的,方法比較冷門,通過使用select(),來設定定時器;原理利用select()方法的第5個引數,第乙個引數設定為0,三個檔案描述符集都設定為null,第5個引數為時間結構體,**如下:

[cpp]view plain

copy

#include 

#include 

#include 

#include 

/*seconds: the seconds; mseconds: the micro seconds*/

void

settimer(

intseconds, 

intmseconds)  

intmain()    

這種方法精度能夠達到微妙級別,網上有很多基於select()的多執行緒定時器,說明select()穩定性還是非常好。

總結:如果對系統要求比較低,可以考慮使用簡單的sleep(),畢竟一行**就能解決;如果系統對精度要求比較高,則可以考慮rtc機制和select()機制。

如何在Linux下實現定時器

如何在 linux 下實現定時器 在 linux 實現乙個定時器,不像 win32 下那樣直觀。在 win32 呼叫settimer 就行了,在 linux 下則沒有相應函式可以直接呼叫。定時器作為乙個常用的功能,在 linux 當然也有相應實現。下面我們看看幾種常用的方法。要實現定時器功能,最土的...

如何在Linux下實現定時器

如何在linux下實現定時器 在linux實現乙個定時器,不像win32下那樣直觀。在win32呼叫settimer就行了,在linux下則沒有相應函式可以直接呼叫。定時器作為乙個常用的功能,在linux當然也有相應實現。下面我們看看幾種常用的方法。要實現定時器功能,最土的辦法實現莫過於用sleep...

Linux下的定時器

linux下的定時器有兩種,以下分別介紹 1 alarm 如果不要求很精確的話,用 alarm 和 signal 就夠了 unsigned int alarm unsigned int seconds 專門為sigalrm訊號而設,在指定的時間seconds秒後,將向程序本身傳送sigalrm訊號,...