Linux應用層的定時器Timer
在linux下提供了兩種基本的Timer機制:alarm和settimer。
1、alarm
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
這是個最簡單的Timer,當呼叫了alarm(n)時,等待n秒後,就會觸發一次SIGALRM訊號,故需要在呼叫alarm函式前先設定好SIGALRM訊號對應的處理函式才行,而當呼叫alarm(0)時,表示停止當前的timer處理,不要發出SIGALRM訊號。
返回值:返回上一次呼叫alarm函式的剩餘秒好,若之前沒有呼叫alarm函式,則返回0。
例(第一次等待1秒觸發Timer,之後都是2秒觸發):
#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;
void my_alarm_handler(int a){
cerr<<"my_alarm_handler"<<endl;
alarm(2);//更改為2秒呼叫一次Timer
}
int main(){
signal(SIGALRM, my_alarm_handler);
alarm(1);
while(1){}
return 0;
}
2、settimer
#include <sys/time.h>
#define ITIMER_REAL 0
#define ITIMER_VIRTUAL 1
#define ITIMER_PROF 2
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue);
settimer和gettimer函式都提供了三種類別的Timer供使用:
1)、ITIMER_REAL:以系統實際的時間來計算,觸發時會發出SIGALRM訊號。
2)、ITIMER_VIRTUAL:只計算程式的執行時間(在使用者態),觸發時會發出SIGVTALRM訊號。
3)、ITIMER_PROF:計算程式在使用者態和核心態的處理時間,觸發時會發出SIGPROF訊號。
通過第一個引數which來指定要使用哪一種Timer(ITIMER_REAL、ITIMER_VIRTUAL、ITIMER_PROF)。settimer函式是用來設定對應的Timer的觸發時間是多少,而gettimer函式是用來獲取上一次Timer設定的時間。設定的時間是一個結構體struct itimerval:
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
struct timeval {
long tv_sec;
long tv_usec;
};
settimer由第二個引數value設定觸發時間,第三個引數ovalue用來獲取上一次settimer設定的itimerval值(該引數可以設定為NULL)。對於itimerval裡面變數的值,當我們設定it_interval的值為0時,Timer只會觸發一次,而it_value設定為0時則表示Timer結束。
返回值:0為成功,-1為失敗。
例(第一次等待1秒觸發Timer,之後都是2秒觸發):
#include <iostream>
#include <sys/time.h>
#include <signal.h>
using namespace std;
void my_alarm_handler(int a){
cerr<<"test "<<endl;
}
int main(){
struct itimerval t;
t.it_interval.tv_usec = 0;
t.it_interval.tv_sec = 2;
t.it_value.tv_usec = 0;
t.it_value.tv_sec = 1;
if( setitimer( ITIMER_REAL, &t, NULL) < 0 ){
cerr<<"settimer error."<<endl;
return -1;
}
signal( SIGALRM, my_alarm_handler );
while(1){
sleep(2);
}
return 0;
}
通過上面的例子,我們可以知道對於linux內建Timer只能同一時間處理3個Timer,如果需要多個的話,那麼這就是個問題了。不過我們可以通過sleep函式或time函式來結合使用實現定時功能,具體可以參考:http://hi.baidu.com/adrain001/blog/item/60580bc40871d6a18226ace4.html
參考網址:
相關文章
- Timer(定時器)定時器
- Java - Timer定時器Java定時器
- Java之定時器TimerJava定時器
- GO的定時器Timer 和定時任務cronGo定時器
- RH Timer for MacRed Hot Timer定時器軟體Mac定時器
- 好用的時間跟蹤定時器:Eon Timer for Mac定時器Mac
- Red Hot Timer定時器軟體:RH Timer for Mac v2.13.0啟用版定時器Mac
- Red Hot Timer定時器軟體:RH Timer for Mac v2.14啟用版定時器Mac
- Java定時器之Timer學習二Java定時器
- Red Hot Timer for Mac定時器軟體Mac定時器
- Camunda定時器事件示例Demo(Timer Events)定時器事件
- Libev——ev_timer 相對時間定時器定時器
- 定時器控制元件 Timer 1130定時器控制元件
- android定時器Timer與TimerTaskAndroid定時器
- Java多執行緒19:定時器TimerJava執行緒定時器
- 深入 Java Timer 定時排程器實現原理Java
- Java Timer原始碼解析(定時器原始碼解析)Java原始碼定時器
- c# winform之手工定時器timer操作示例C#ORM定時器
- Windbg在應用層除錯漏洞時的應用除錯
- javascript基礎(定時器的應用)(四十三)JavaScript定時器
- Java 定時器 Timer 原始碼分析和使用建議Java定時器原始碼
- Linux時間子系統之七:定時器的應用--msleep(),hrtimer_nanosleep()Linux定時器NaN
- Linux時間子系統之七:定時器的應用--msleep(),hrtimer_nanosleep()【轉】Linux定時器NaN
- 深入 Java Timer 定時任務排程器實現原理Java
- 定時器軟體RH Timer 不錯過任何事定時器
- 計時器的應用
- Linux核心定時器Linux定時器
- Linux 定時器alarm()Linux定時器
- 瞭解安卓架構(linux核心層、系統執行庫層、應用框架層、應用層)安卓架構Linux框架
- Golang 定時器底層實現深度剖析Golang定時器
- Win32彙編教程十 定時器的應用 (轉)Win32定時器
- 關於linux下定時器,多定時器Linux定時器
- java定時任務--Timer、TimerTaskJava
- MY_GEEK_計時器的timer實現
- 多功能計時器Chain Timer for MacAIMac
- 計時器軟體:Chain Timer for macAIMac
- 學習Timer類,定製自己的排程器
- C# 定時器 Timer 如何精確到 1-2 毫秒以內C#定時器