日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux C: 定时器及时钟服务

發布時間:2024/10/14 linux 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux C: 定时器及时钟服务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、定時器種類??

對于 Intel x86?有多個定時器:

? 1) 實時時鐘 (RTC): RTC 由一個獨立的小型備用電池供電。通常用于提供計算機的時間和日歷信息。即使在計算機斷電的情況下,RTC 還是可以獨立得進行計數。在所有類Unix 系統中,時間變量是一個 long? int? 型,記錄自1970/1/1 起經過的秒數。

? 2)可編程的間隔定時器(PIT) :

? ? ? ?PIT是與 CPU分離的一個定時器,以毫秒為刻度。在所有IO設備中,PIT 可以最高優先級 IRQ0 中斷。PIT定時器中斷由Linux內核的定時器中斷處理程序來處理,為系統提供基本的定時單元。

?3)多核CPU的本地定時器。每一個核都有只屬于自己的本地定時器,由CPU時鐘驅動。

?4)高分辨率定時器:大多數電腦都有一個時間戳定時器(TSC) ,由系統時鐘驅動,內容可以通過64位TSC寄存器讀取。在大多數電腦下可提供納秒級的刻度。

二、 時鐘服務函數 和相關的數據結構

在 sys/time.h 下由如下時間服務的系統調用:

? gettimeofday? ?和? ?settimeofday

#include <sys/time.h> #include <time.h> //第二個參數timezone類型已過期,傳參的時候應設置為NULLint gettimeofday(struct timeval * tv ,struct timezone *tz); //獲取系統時間 int settimeofday(const struct timeval * tv ,const struct timezone *tz);//設置系統時間//時間結構體 struct timeval{time_t tv_sec ; //秒suseconds_t tc_usec; //微秒 }// 返回系統時間,獲取以秒單位的系統時間,形參指向該返回對應的內存地址。 time_t? time(time_t *t);?

三、間隔定時器

Linux在 sys/time.h 下提供了三種不同類型的定時器,ITIMER_REAL ,ITIMER_VIRTUAL, ITIMER_PROF. 定時器主要由間隔時間和 倒計時組成,不同類型的定時器計數到期時,就會向進程發送一個信號

定時器類型描述產生的信號
ITIMER_REAL實時計數SIGALRM (14)
ITIMER_VIRTUAL僅在用戶模式下計數SIGVTALRM (26)
ITIMER_PROF當在用戶模式和內核模式下計數,常配合ITIMER_VIRTUAL來分析用戶模式下和內核模式下的執行時間SIGPROF(27)

定時器數據結構和相關的系統調用如下

int getitimer(int which,struct itimerval *curr_value); //初始化定時器種類 int setitimer(int which,const struct itimerval *newvalue,const struct itimerval *oldvalue);//每間隔it_interval時間后開始倒計時it_value,每次倒計時結束產生信號 struct itimerval {struct timeval it_interval; //時間間隔struct timeval it_value; //倒計時時間 }//當產生signal信號值時,觸發執行handler函數 signal(int signal , void handler(int) );

四、示例

下面是每間隔1s,倒計時100毫秒觸發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); }

輸出結果:

總結

以上是生活随笔為你收集整理的Linux C: 定时器及时钟服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。