Linux下的定時器

2021-09-01 16:49:36 字數 1690 閱讀 8967

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下的定時器

1.alarm 執行後,程序將繼續執行。在後期 alarm以後 的執行過程中將會在seconds秒後收到訊號sigalrm並執行其處理函式。include include include void sigalrm fn int sig int main void 2.alarm定時器,可是僅僅能精確...

linux下的「定時器」 crontab

crontab是用來設定在固定時間點或時間間隔執行某條指令,類似於時程表。使用 u user是指定user使用者的時程表。e username 調出編輯器,編輯定時任務,開啟後裡邊有多重文字編輯器,可更具自己偏好選擇,若未指定username,則是當前shell下的使用者 r username 刪除...

linux下的定時器的使用

ifdef linux evn socket include include include include include include include include include include endif 傳送back硬按鍵定時器的標誌位 static int flag back tim...