Linux下定時器使用

2021-04-08 14:34:58 字數 1712 閱讀 3232

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...