linux下的定時器有兩種,以下分別介紹:
1、alarm
如果不要求很精確的話,用 alarm() 和 signal() 就夠了
unsigned int alarm(unsigned int seconds)
專門為sigalrm訊號而設,在指定的時間seconds秒後,將向程序本身傳送sigalrm訊號,又稱為鬧鐘時間。程序呼叫alarm後,任何以前的alarm()呼叫都將無效。如果引數seconds為零,那麼程序內將不再包含任何鬧鐘時間。如果呼叫alarm()前,程序中已經設定了鬧鐘時間,則返回上乙個鬧鐘時間的剩餘時間,否則返回0。
示例:
#include
#include
#include
void sigalrm_fn(int sig)
int main(void)
2、setitimer
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
setitimer()比alarm功能強大,支援3種型別的定時器:
itimer_real : 以系統真實的時間來計算,它送出sigalrm訊號。
itimer_virtual : 以該行**正有執行的時間來計算,它送出sigvtalrm訊號。
itimer_prof : 以行**正有執行及在核心中所費的時間來計算,它送出sigprof訊號。
setitimer()第乙個引數which指定定時器型別(上面三種之一);第二個引數是結構itimerval的乙個例項;第三個引數可不做處理。
setitimer()呼叫成功返回0,否則返回-1。
下面是關於setitimer呼叫的乙個簡單示範,在該例子中,每隔一秒發出乙個sigalrm,每隔0.5秒發出乙個sigvtalrm訊號::
#include
#include
#include
#include
#include
#include
int sec;
void sigroutine(int signo)
return;
} int main()
該例子的螢幕拷貝如下:
localhost:~$ ./timer_test
process id is 579
catch a signal – sigvtalrm
catch a signal – sigalrm
catch a signal – sigvtalrm
catch a signal – sigvtalrm
catch a signal – sigalrm
catch a signal –gvtalrm
注意:linux訊號機制基本上是從unix系統中繼承過來的。早期unix系統中的訊號機制比較簡單和原始,後來在實踐中暴露出一些問題,因此,把那些建立在早期機制上的訊號叫做"不可靠訊號",訊號值小於sigrtmin(red hat 7.2中,sigrtmin=32,sigrtmax=63)的訊號都是不可靠訊號。這就是"不可靠訊號"的**。它的主要問題是:程序每次處理訊號後,就將對訊號的響應設定為預設動作。在某些情況下,將導致對訊號的錯誤處理;因此,使用者如果不希望這樣的操作,那麼就要在訊號處理函式結尾再一次呼叫signal(),重新安裝該訊號。
Linux下定時器使用
linux下的定時器有兩種,以下分別介紹 1 alarm 如果不要求很精確的話,用 alarm 和 signal 就夠了 unsigned int alarm unsigned int seconds 專門為sigalrm訊號而設,在指定的時間seconds秒後,將向程序本身傳送sigalrm訊號,...
Windows下定時器使用注意事項
在windows平台下,一般使用settimer函式建立乙個計時器,killtimer函式用於銷毀乙個計時器。計時器屬於系統資源,使用完應及時銷毀。settimer基於windows的訊息 message 有可能被阻塞。使用wm timer訊息觸發定時器並不精確。有兩個原因 原因一 windows計...
linux下定時器的使用
linux下定時器的使用主要用到兩個函式 setitimer 和getitimer linux系統給每個程序提供了3個定時器,每個定時器在各自不同的域裡面計數,當任何乙個timer計數結束了,系統就發乙個訊號 signal 給該程序,同時計數器重置。以下是支援的三種計數器形式 1 itimer re...