Linux操作系統為每一個進程提供了3個內部計時器。
ITIMER_REAL;ITIMER_VIRTUAL;ITIMER_PROF.
ITIMER_REAL:給定一個指定的時間間隔,按照實際的時間來減少這個計數,當時間間隔為0的時候發出SIGALRM信號。
ITIMER_VIRTUAL:給定一個時間間隔,當進程執行的時候才減少計數,時間間隔為0的時候發出SIGVTALRM信號。
ITIMER_PROF:給定一個時間間隔,當進程執行或者是系統為進程調度的時候,減少計數,時間到了,發出SIGPROF信號,這個和TIMER_VIRTUAL聯合,常用來計算系統內核時間和用戶時間。
看一下getitimer的數據手冊
getitimer, setitimer - get or set value of an interval timer
#include <sys/time.h>
int getitimer(int which, struct itimerval *value);
int setitimer(int which, char struct itimerval *value, struct itimerval *ovalue);
ITIMER_REAL;ITIMER_VIRTUAL;ITIMER_PROF.就是三個定時器,在使用的時候,當其中的任何一個時間到了,都會給進程發送一個信號,然後定時器重新被裝填,重新開始定時動作。
它們對應的信號
ITIMER_REAL ---- SIGALRM
ITIMER_VIRTUAL ---- SIGVTALRM
ITIMER_PROF ---- SIGPROF
函數中的which就是選擇這三個定時器中的一個。
下面是描述時間結構體value的
struct itimerval {
struct timeval it_interval; //下一個值
struct timeval it_value; //當前的值
};
struct timeval {
long tv_sec; //秒
long tv_usec; //毫秒
};
一個表示時間的結構體,一個含有時間結構體的結構體。
使用定時器的時候,首先定義一個時間結構體,然後初始化這個時間結構體的秒和毫秒。然後使用setitimer函數,第一個參數指定使用哪一個定時器,第二個參數就是傳遞進去的時間結構體,第三個參數為NULL。這樣就設定好了一個定時器了。它就可以開始工作了。
說一下返回值: 函數調用成功返回0, 錯誤返回-1,並且設置出錯值errno。
當出錯的時候:可能是value或者是ovalue指針無效;或者是定時器搞錯了,不是這三個中的一個;或者是時間結構體中的毫秒超出了0到999999的范圍。
由於當定時器的時間到了的時候會引發一個信號,因此我們必須對信號進行處理,因此需要了解一下信號處理的函數。
我們可以修改Linux系統信號的相關聯的動作,也就是當捕獲到某個信號時需要執行什麼函數。有點像是可以更改函數指針指向的函數一樣。
有這麼一個函數可以完成這個問題:sigaction。
也就是sig-action,signal-action,信號動作。
#include<sginal.h>
int sigaction(int signo, const struct sigacton *rstrict act, struct sigaction *restrict oact);
這個函數具有三個參數,第一個是信號的名字,直接寫系統的信號名,比如SIGALRM之類的。第二個參數是一個結構體,表述了信號相關的東西,我們修改的函數指針就在裡面。第三個函數是用來返回的,返回該信號的上一個動作,也就是上一個這個信號結構體裡面的函數指針指向的函數。