天天看點

用c語言編寫定時器程式,C語言怎麼實作定時器

C語言怎麼實作定時器    比如我現在要3分鐘執行一次我的函數   怎麼做。

|

Linux下的定時器:alarm()與setitimer()

http://blog.csdn.net/feiyinziiuxx/archive/2009/08/26/4488140.aspx

|

// init timer

void TimerFactory::init_timer()

{

struct itimerval value;

value.it_value.tv_sec  = 1; // min interval 1 second

value.it_value.tv_usec = 0;

value.it_interval      = value.it_value;

Setitimer(ITIMER_REAL, &value, NULL );

return;

}

// init signal

void TimerFactory::init_signal()

{

Signal(SIGALRM, on_alarm);

return;

}

// callback to do things when SIGALARM arrived

void TimerFactory::on_alarm(int signo)

{

// do things you like here.

return;

}

|

如果是c++,可以參考這個,裡面有一個現成的類,或者用boost::asio庫

http://stackoverflow.com/questions/503866/timer-class-in-linux

|

SIGPIPE 是一種由軟體條件産生的信号,在例 3.7 “管道”中已經介紹過了。

本節主要介紹 alarm 函數和 SIGALRM 信号。

#include

unsigned int alarm(unsigned int seconds);

調用 alarm 函數可以設定一個鬧鐘,也就是告訴核心在 seconds 秒之後給目前

程序發 SIGALRM 信号,該信号的預設處理動作是終止目前程序。這個函數的返

回值是 0 或者是以前設定的鬧鐘時間還餘下的秒數。打個比方,某人要小睡一

覺,設定鬧鐘為 30 分鐘之後響,20 分鐘後被人吵醒了,還想多睡一會兒,于

是重新設定鬧鐘為 15 分鐘之後響,“以前設定的鬧鐘時間還餘下的時間”就是

10 分鐘。如果 seconds 值為 0,表示取消以前設定的鬧鐘,函數的傳回值仍然

是以前設定的鬧鐘時間還餘下的秒數。

例 6.1. alarm

#include

#include

int main(void)

{

int counter;

alarm(1);

for(counter=0; 1; counter++)

printf("counter=%d ", counter);

return 0;

}

這個程式的作用是 1 秒鐘之内不停地數數,1 秒鐘到了就被 SIGALRM 信号終

止。

|

網上找到的, 我整理了一下:

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

Linux 為每個程序提供的3個内部計時器:

ITIMER_REAL: 給一個指定的時間間隔, 按照實際的時間來減少這個計數, 當時間間隔為0的時候發出SIGALRM信号.

ITIMER_VIRTUAL: 給定一個時間間隔, 當程序執行的時候才減少計數, 時間間隔為0的時候發出SIGVTALRM信号.

ITIMER_PROF: 給定一個時間間隔, 當程序執行或者是系統為程序排程的時候, 減少計數, 時間到了, 發出SIGPROF信号, 這個和ITIMER_VIRTVAL聯合, 常用來計算系統核心時間和使用者時間.

常用到的函數:

#include

int getitimer (int which, struct itimerval* value);

int setitimer (int which, struct itimerval* newvalue, struct itimerval* oldvalue);

struct timeval

{

long tv_sec;

long tv_usec;

};

struct itimerval

{

struct timeval it_interval; 

struct timeval it_value;

};

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秒, 再重新計數.

|

一種不可移植的方法是調用sleep(),一種可移植但不優雅的方法是:

調用gettimeofday()取得此刻的時間

while(1)

{

調用gettimeofday()取得此刻的時間

if(兩個時間差滿足你的要求) break;

}

|

不推薦使用 有時候會導緻CPU使用率老高了

用1樓說的alarm()與setitimer()

具體用法google一下 寫個簡單的代碼練習一下就會了

|

這個玩意就是一種無奈,很多時候都要在可移植性和效率中作二選一。

|

你可以直接調用alarm。

其本質就是計時加上信号觸發。

此外,select計時更精确,雖然不是專門用來計時的

|

很精辟!

|

學習

|

mark