定時器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訊號,...