自學Linux Linux計時器

2021-06-02 21:54:10 字數 2989 閱讀 5140

linux中訊號的種類:

sighup 當終止乙個終端時,核心就把這種訊號傳送給該終端所控制的所有程序.

sigint 當乙個使用者按下中斷鍵(ctrl+c)後,核心就向該終端用關聯的所有程序傳送這個訊號.

sigquit 當使用者按下(ctrl+),核心就向該終端用關聯的所有程序傳送這個訊號.

sigill 當乙個程序企圖執行一條非法指令時,核心就傳送這個訊號.

sigfpe 當產生浮點錯誤時,核心就傳送這個訊號.

sigkill 這是乙個非常特殊的訊號,他可以從乙個程序傳送到另乙個程序,使接收到該訊號的程序終止.核心偶然也傳送這種訊號.

sigalrm 當乙個定時器到時的時候,核心就傳送這個訊號.

sigstop 子程序結束訊號.unix用它來實現系統呼叫exit(),wait();

linux中,可以用signal函式接受上面的各種訊號,並可以指定接受到這些訊號之後的「動作」

#includetypedef void (*sighandler_t)( int )

sighandler_t signal(int signum , sighandler_t handler)

當handler為:

sig_ign 忽略這個訊號.

sig_dfl 恢復對這個訊號的預設處理.

/*

alarm & signal函式

功能:每隔一定的時間就去執行一次相應的操作(catch函式)

*/#include#include#include#includevoid catch(int ) ;

int main()

return 0;

}void catch(int sig)

執行結果:

除此之外,linux還提供了3個內建的計時器:

itimer_real:實時定時器,不管程序在何種模式下執行(甚至在程序被掛起時),它總在計數。定時到達,向程序傳送sigalrm訊號。

itimer_virtual:這個不是實時定時器,當程序在使用者模式(即程式執行時)計算程序執行的時間。定時到達後向該程序傳送sigvtalrm訊號。 

itimer_prof:程序在使用者模式(即程式執行時)和核心模式(即程序排程用時)均計數。定時到達產生sigprof訊號。itimer_prof記錄的時間比itimer_virtual多了程序排程所花的時間。

定時器在初始化是,被賦予乙個初始值,隨時間遞減,遞減至0後發出訊號,同時恢復初始值。在任務中,我們可以一種或者全部三種定時器,但同一時刻同一型別的定時器只能使用乙個。

用到的函式有:

#includeint getitimer(int which , struct itimerval *curr_value) ;

int setitimer(int which , struct itimerval *new_value , struct itimerval *old_value);

which是模式,有itimer_real, itimer_virtual. itimer_prof三種模式。

struct itimerval

struct timeval

it_interval用來指定每隔多長時間執行任務, it_value用來儲存當前時間離執行任務還有多長時間。比如說, 你指定it_interval為2秒(微秒為0),開始的時候我們把it_value的時間也設定為2秒(微秒為0),當過了一秒, it_value就減少乙個為1, 再過1秒,則it_value又減少1,變為0,這個時候發出訊號(告訴使用者時間到了,可以執行任務了),並且系統自動把it_value的時間重置為it_interval的值,即2秒,再重新計數。

/*

sample .1 :

linux內建的計時器計時.

*/#include#include#include#include/*訊號處理函式*/

static void sighandler(int signo) ;

/*訊號處理中的輔助函式*/

void timepassed(struct itimerval *itimer , struct timeval *tv) ;

void kernel_time(struct timeval *itimer1, struct timeval *itimer2 , struct timeval *tv ) ;

int main(int argc, char **argv)

return 0;

}/*訊號處理函式*/

void sighandler(int sig)

}/*求兩個時間的時間差*/

void timepassed(struct itimerval *itimer, struct timeval *tv)

tv->tv_sec = temp1.tv_sec - temp2.tv_sec ;

tv->tv_usec = temp1.tv_usec - temp2.tv_usec ;

}/*計算核心的時間,即程序排程的時間*/

void kernel_time(struct timeval *it1, struct timeval *it2 , struct timeval *tv)

tv->tv_sec = it1->tv_sec - it2->tv_sec ;

tv->tv_usec = it1->tv_usec - it2->tv_usec ;

}

執行結果:

/*

sample .2

linux 系統內建計時器

*/#include#include#include#include#include#includevoid cal(int sig)

return ;

}int main(int argc, char **argv)

python計時器 python 計時器

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

python計時器單位 python計時器類

import time as t class mytimer def init self self.unit 年 月 日 時 分 秒 self.prompt 未開始計時 self.lasted self.start 0 self.stop 0 def str self return self.pro...

伺服器計時器與 Windows 計時器

說明 此文大部分內容摘自msdn,本人只是做了一點整理。如果有什麼異議,一切以msdn為準。一 引言 在 visual studio net 中有兩種計時器控制項 基於伺服器的計時器和標準的基於 windows 的計時器。基於 windows 的計時器為在 windows 窗體應用程式中使用而進行了...