Linux 計時器 函式

2021-06-01 11:45:35 字數 2461 閱讀 7407

程式註冊三個定時器,分別對實際時間、程序使用cpu時間、使用者使用cpu時間進行即時,計時時間為10秒。同時設定乙個使用者訊號,當該訊號在使用者指定的空計次迴圈後到來。在使用者訊號到來後,列印各個計時器走過的時間值,並計算出核心所用的時間。到實際時間計時器到達10秒後產生定時器訊號時,程式列印各計時器走過的時間,並退出程式。

因為需要獲得定時器的時間,因此,我們需要使用setitimer和getitimer計時器。使用這兩個計時器要頻繁的對itimerval和timeval這兩個結構體進行操作。首先,應該對這兩個結構體在本例項中常用到的操作進行封裝。封裝的函式包括,timeval的比較,計算兩個timeval的時間差,計算itimerval走過的時間(因為itimerval記錄的是定時器剩餘時間)。為了顯示的需要,我們需要封裝乙個對timeval列印的函式。

之後,我們需要設計訊號和訊號處理函式,這裡我們一共需要兩個訊號:sigalrm和sigusr1。因為訊號處理函式有乙個int型引數,該引數可以用來區分訊號。考慮到,兩個訊號到來以後都需要進行時間計算。因此可以考慮將兩個訊號寫成乙個函式,通過引數識別,在不同的位置進行不同的處理。

#include #include #include #include #include /* 函式宣告 */

/* 訊號處理函式 */

static void sighandler(int signo);

/* 操作輔助函式 */

void timerpassed(const struct itimerval *itimer, struct timeval *tv);

void timesubstract(const struct timeval *tv1, const struct timeval *tv2, struct timeval *tvres);

int timecompare(const struct timeval *tv1, const struct timeval *tv2);

void printtimeval(const char *str, const struct timeval *tv);

/* 主函式,程式入口點 */

int main()

/* 定時器訊號處理函式 */

/* 這裡將同乙個函式註冊給兩個訊號,函式內部存在區分訊號型別的邏輯 */

if (signal(sigalrm, sighandler) == sig_err)

/* 執行引數輸入 */

printf("loop times between timer info outputs (300 recommanded):\n");

scanf("%ld", &count);

count *= 1000000;

/* 初始化定時器引數 */

myitimer.it_interval.tv_sec = 10;

myitimer.it_interval.tv_usec = 0;

myitimer.it_value.tv_sec = 10;

myitimer.it_value.tv_usec = 0;

/* 註冊定時器 */

setitimer(itimer_real, &myitimer, null); /* 實時定時器 */

setitimer(itimer_virtual, &myitimer, null); /* 使用者定時器 */

setitimer(itimer_prof, &myitimer, null); /* cpu定時器 */

/* 無限迴圈,等待訊號處理 */

while (1)

}/* 訊號處理函式 */

static void sighandler(int signo)

}/* 計算時間的流逝 */

void timerpassed(const struct itimerval *itimer, struct timeval *tv)

/* 計算兩個時間的差值 */

void timesubstract(const struct timeval *tv1, const struct timeval *tv2, struct timeval *tvres)

else

/* 做差時存在借位的情況 */

if (tmptv1->tv_usec < tmptv2->tv_usec) else

}/* 時間值比較大小 */

int timecompare(const struct timeval *tv1, const struct timeval *tv2)

/* 列印時間 */

void printtimeval(const char *str, const struct timeval *tv)

程式會提示你輸入空迴圈的次數,2.7ghz的cpu在空閒的時候使用300至500時大約會1秒鐘顯示一次時間。數值越大顯示時間的間隔越長,根據你的計算機的具體情況而定。此外輸出的資料也各你當前系統狀態而定。

Linux 計時器 函式

程式註冊三個定時器,分別對實際時間 程序使用cpu時間 使用者使用cpu時間進行即時,計時時間為10秒。同時設定乙個使用者訊號,當該訊號在使用者指定的空計次迴圈後到來。在使用者訊號到來後,列印各個計時器走過的時間值,並計算出核心所用的時間。到實際時間計時器到達10秒後產生定時器訊號時,程式列印各計時...

Linux 計時器 函式

程式註冊三個定時器,分別對實際時間 程序使用cpu時間 使用者使用cpu時間進行即時,計時時間為10秒。同時設定乙個使用者訊號,當該訊號在使用者指定的空計次迴圈後到來。在使用者訊號到來後,列印各個計時器走過的時間值,並計算出核心所用的時間。到實際時間計時器到達10秒後產生定時器訊號時,程式列印各計時...

python計時器 python 計時器

import sysclassshowtime qwidget def init self super init self.istimestart false 標記時間是否開始計時 self.setwindowtitle qlable 顯示計時時間 self.lable time val qlabe...