Linux C定時器使用指南

2021-09-07 18:40:48 字數 2891 閱讀 3430

使用定時器的目的是為了週期性的執行某一任務,或者是到了某個指定時間去執行某一任務。要達到這一目的,一般有兩個常見的方法。乙個是用linux內部的三個定時器,另乙個是用sleep, usleep函式讓程序睡眠一段時間,其實,還有乙個方法,那就是用gettimeofday, difftime等自己來計算時間間隔,然後時間到了就執行某一任務,但是這種方法效率低,所以不常用。

首先來看看linux作業系統為每乙個程序提供的3個內部計時器。

用到的函式有:

#include
int getitimer(

int which,

struct itimerval *value)

;

int setitimer(

int which,

struct itimerval*newvalue,

struct itimerval* oldvalue)

;

strcut timeval 

;

struct itimerval

;

it_interval用來指定每隔多長時間執行任務, it_value用來儲存當前時間離執行任務還有多長時間。比如, 你指定it_interval為2秒(微秒為0),開始的時候我們把it_value的時間也設定為2秒(微秒為0),當過了一秒, it_value就減少乙個為1, 再過1秒,則it_value又減少1,變為0,這個時候發出訊號(告訴使用者時間到了,可以執行任務了),並且系統自動把it_value的時間重置為 it_interval的值,即2秒,再重新計數。 為了幫助你理解這個問題,我們來看乙個例子:

#include
#include
#include
#include
#include
static

char msg[

]= 「time is running out\n」;

static

int len;

// 向標準錯誤輸出資訊,告訴使用者時間到了
void prompt_info(

int signo)

// 建立訊號處理機制

void init_sigaction(

void

)void init_time(

)int main(

)

該程式的itmer_real定時器,每隔2秒鐘都會傳送乙個sigalrm訊號,當主函式接收到了這個訊號之後,呼叫訊號處理函式 prompt_info在標準錯誤上輸出time is running out這個字串。

itimer_virtual和itimer_prof的使用方法類似,當你在setitimer裡面設定的定時器為 itimer_virtual的時候,你把sigaction裡面的sigalrm改為si**talarm, 同理,itimer_prof對應sigprof。

不過,你可能會注意到,當你用itimer_virtual和itimer_prof的時候,你拿乙個秒錶,你會發現程式輸出字串的時間間隔會不止2秒,甚至5-6秒才會輸出乙個,至於為什麼,自己好好琢磨一下。

如果函式init_sigaction報錯:

解決方法:在檔案最開頭加上如下**(在所有#include之前)

#define _xopen_source
下面我們來看看用sleep以及usleep怎麼實現定時執行任務。

#include
#include
#include
#include
static

char msg[

]= 「i received a msg.\n」;

int len;
void show_msg(

int signo)

int main(

)return0;

}

看到了吧,這個要比上面的簡單多了,而且你用秒錶測一下,時間很準,指定2秒到了就給你輸出乙個字串。所以,如果你只做一般的定時,到了時間去執行乙個任務,這種方法是最簡單的。

下面我們來看看,通過自己計算時間差的方法來定時:

#include
#include
#include

#include
#include
static

char msg[

]= 「i received a msg.\n」;

int len;
static time_t lasttime;
void show_msg(

int signo)

int main()}

return0;

}

這個和上面不同之處在於,是自己手工計算時間差的,如果你想更精確的計算時間差,你可以把 time 函式換成gettimeofday,這個可以精確到微妙。(注:1秒=1000毫秒ms =106微秒µs) 上面介紹的幾種定時方法各有千秋,在計時效率上、方法上和時間的精確度上也各有不同,採用哪種方法,就看你程式的需要。

#include
#include
#include//itimerval結構體的定義
int handle_count=

0;

void set_time(

void

)void alarm_handle(

int sig)

void main(

void

)

return

;}

定時器使用

dword winapi checksendinfovector lpvoid lpparameter return 0 void callback dotimer hwnd hwnd,uint umsg,uint ptr idevent,dword dwtime timerproc的引數hwnd是...

Delphi Timer定時器使用

timer定時器是乙個非視覺化元件,能夠定時觸發ontimer事件,完成模擬時鐘 系統延時 倒計時等工作。在system選項卡中。1 timer的主要屬性 1 enabled屬性 當值為true時,開啟定時器,否則關閉定時器。預設值為true。2 interval屬性 控制ontimer事件觸發的時...

workman定時器使用

workerman 定時器例子,可單獨使用,稍加改善可以開啟乙個守護程序,用來做一些定時發布等等類似的任務,使用方便,不需要額外的擴充套件或者類似 crontab 等工具。以下是測試程式 php view plain copy use workerman autoloader use workerm...