程式註冊三個定時器,分別對實際時間、程序使用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...