Linux C: 定时器及时钟服务
一、定時器種類??
對于 Intel x86?有多個定時器:
? 1) 實(shí)時時鐘 (RTC): RTC 由一個獨(dú)立的小型備用電池供電。通常用于提供計算機(jī)的時間和日歷信息。即使在計算機(jī)斷電的情況下,RTC 還是可以獨(dú)立得進(jìn)行計數(shù)。在所有類Unix 系統(tǒng)中,時間變量是一個 long? int? 型,記錄自1970/1/1 起經(jīng)過的秒數(shù)。
? 2)可編程的間隔定時器(PIT) :
? ? ? ?PIT是與 CPU分離的一個定時器,以毫秒為刻度。在所有IO設(shè)備中,PIT 可以最高優(yōu)先級 IRQ0 中斷。PIT定時器中斷由Linux內(nèi)核的定時器中斷處理程序來處理,為系統(tǒng)提供基本的定時單元。
?3)多核CPU的本地定時器。每一個核都有只屬于自己的本地定時器,由CPU時鐘驅(qū)動。
?4)高分辨率定時器:大多數(shù)電腦都有一個時間戳定時器(TSC) ,由系統(tǒng)時鐘驅(qū)動,內(nèi)容可以通過64位TSC寄存器讀取。在大多數(shù)電腦下可提供納秒級的刻度。
二、 時鐘服務(wù)函數(shù) 和相關(guān)的數(shù)據(jù)結(jié)構(gòu)
在 sys/time.h 下由如下時間服務(wù)的系統(tǒng)調(diào)用:
? gettimeofday? ?和? ?settimeofday
#include <sys/time.h> #include <time.h> //第二個參數(shù)timezone類型已過期,傳參的時候應(yīng)設(shè)置為NULLint gettimeofday(struct timeval * tv ,struct timezone *tz); //獲取系統(tǒng)時間 int settimeofday(const struct timeval * tv ,const struct timezone *tz);//設(shè)置系統(tǒng)時間//時間結(jié)構(gòu)體 struct timeval{time_t tv_sec ; //秒suseconds_t tc_usec; //微秒 }// 返回系統(tǒng)時間,獲取以秒單位的系統(tǒng)時間,形參指向該返回對應(yīng)的內(nèi)存地址。 time_t? time(time_t *t);?三、間隔定時器
Linux在 sys/time.h 下提供了三種不同類型的定時器,ITIMER_REAL ,ITIMER_VIRTUAL, ITIMER_PROF. 定時器主要由間隔時間和 倒計時組成,不同類型的定時器計數(shù)到期時,就會向進(jìn)程發(fā)送一個信號
| 定時器類型 | 描述 | 產(chǎn)生的信號 |
| ITIMER_REAL | 實(shí)時計數(shù) | SIGALRM (14) |
| ITIMER_VIRTUAL | 僅在用戶模式下計數(shù) | SIGVTALRM (26) |
| ITIMER_PROF | 當(dāng)在用戶模式和內(nèi)核模式下計數(shù),常配合ITIMER_VIRTUAL來分析用戶模式下和內(nèi)核模式下的執(zhí)行時間 | SIGPROF(27) |
定時器數(shù)據(jù)結(jié)構(gòu)和相關(guān)的系統(tǒng)調(diào)用如下
int getitimer(int which,struct itimerval *curr_value); //初始化定時器種類 int setitimer(int which,const struct itimerval *newvalue,const struct itimerval *oldvalue);//每間隔it_interval時間后開始倒計時it_value,每次倒計時結(jié)束產(chǎn)生信號 struct itimerval {struct timeval it_interval; //時間間隔struct timeval it_value; //倒計時時間 }//當(dāng)產(chǎn)生signal信號值時,觸發(fā)執(zhí)行handler函數(shù) signal(int signal , void handler(int) );四、示例
下面是每間隔1s,倒計時100毫秒觸發(fā)handler的示例。
/**********setitimer.c*******************/ #include <signal.h> #include <stdio.h> #include <sys/time.h> #include <time.h> int count = 0; struct itimerval t; time_t start,end ; void timer_handler(int sig){end =time(NULL);printf("timer_handler : signal %d count=%d , diff: %ld \n",sig, ++count,end -start);start = end;if( count >= 8){printf("cancel timer \n");t.it_value.tv_sec = 0 ;t.it_value.tv_usec = 0;setitimer(ITIMER_VIRTUAL, &t , NULL);} }int main(){struct itimerval timer ;signal (SIGVTALRM ,timer_handler);timer.it_value.tv_sec = 0;timer.it_value.tv_usec = 100000;//every 1s afterwardtimer.it_interval.tv_sec = 1;timer.it_interval.tv_usec = 0;// start a virtual itimerstart = time(NULL);setitimer( ITIMER_VIRTUAL , &timer ,NULL );printf("press Ctrl + C to terminate \n");while(1); }輸出結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的Linux C: 定时器及时钟服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux C :线程操作和线程同步的多
- 下一篇: Linux C: 信号及异常和捕捉函数原