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