新聞中心
深入理解linux setitimer函數(shù)

在Linux系統(tǒng)中,setitimer函數(shù)是一種很重要的系統(tǒng)調(diào)用函數(shù)。它主要用于設(shè)置定時器,以便在程序運行時按照指定的時間間隔執(zhí)行任務(wù)。本文將探討setitimer函數(shù)的使用方法、參數(shù)含義以及內(nèi)部實現(xiàn)原理,幫助讀者更深入地理解這個函數(shù)。
1. setitimer函數(shù)的定義
setitimer函數(shù)是一個系統(tǒng)調(diào)用函數(shù),其主要作用是設(shè)置定時器。該函數(shù)定義在頭文件中,具體語法如下:
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
其中,which參數(shù)用于指定要設(shè)置的定時器類型,可以為:
– ITIMER_REAL:用于處理真實時間。
– ITIMER_VIRTUAL:用于處理進程占用的CPU時間。
– ITIMER_PROF:用于處理進程以及它的子進程使用的CPU時間。
new_value參數(shù)用于設(shè)置新的時間間隔, old_value用于指定舊的時間間隔。如果舊的時間間隔不再需要,可以將其值設(shè)為NULL。
2. setitimer函數(shù)的參數(shù)含義
在使用setitimer函數(shù)時,需要了解其參數(shù)的含義。下面是對每個參數(shù)的解釋:
a) which參數(shù)
which參數(shù)指定了要設(shè)置的定時器類型。在Linux系統(tǒng)中,共有三種定時器類型,分別為ITIMER_REAL、ITIMER_VIRTUAL和ITIMER_PROF。
其中,ITIMER_REAL用于處理真實時間,這種情況下如果定時器時間到了,內(nèi)核會向進程發(fā)送SIGALRM信號。該信號可以被捕獲并對其進行處理。
ITIMER_VIRTUAL用于處理進程占用的CPU時間。每次進程運行時,進程占用的CPU時間都會被累加到ITIMER_VIRTUAL定時器中,當(dāng)定時器時間到了,內(nèi)核也會向進程發(fā)送SIGVTALRM信號。
ITIMER_PROF用于處理進程以及它的子進程使用的CPU時間。每次進程或其子進程運行時,占用的CPU時間都會被累加到ITIMER_PROF定時器中。當(dāng)定時器時間到了,內(nèi)核會向進程發(fā)送SIGPROF信號。
b) new_value參數(shù)
new_value參數(shù)用于設(shè)置新的時間間隔,以及定時器的一個初始值。該參數(shù)是一個指向itimerval結(jié)構(gòu)體的指針,該結(jié)構(gòu)體的定義如下:
struct itimerval {
struct timeval it_interval; /* timer interval */
struct timeval it_value; /* current value */
};
在該結(jié)構(gòu)體中,it_interval成員用于表示定時器時間間隔,it_value則表示定時器的初始值。其中,it_interval和it_value都是一個timeval結(jié)構(gòu)體類型的值。
timeval結(jié)構(gòu)體的定義如下:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
該結(jié)構(gòu)體成員tv_sec用于表示秒數(shù),tv_usec用于表示微秒數(shù)。
c) old_value參數(shù)
old_value參數(shù)用于保存舊的時間間隔。該參數(shù)是一個指向itimerval結(jié)構(gòu)體的指針。
3. setitimer函數(shù)的使用示例
下面是一個簡單的示例,演示如何使用setitimer函數(shù)實現(xiàn)定時器功能。
在本例中,我們使用ITIMER_REAL定時器,每隔三秒鐘向標準輸出打印一句“Hello, World!”。代碼如下:
#include
#include
#include
#include
#include
/* SIGALRM信號處理函數(shù) */
void handler(int sig)
{
printf(“Hello, World!\n”);
}
int mn()
{
struct itimerval value;
/* 設(shè)置定時器時間間隔 */
value.it_value.tv_sec = 3;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 3;
value.it_interval.tv_usec = 0;
/* 注冊信號處理函數(shù) */
if(signal(SIGALRM, handler) == SIG_ERR)
{
perror(“signal error”);
exit(EXIT_FLURE);
}
/* 開始計時 */
if(setitimer(ITIMER_REAL, &value, NULL) == -1)
{
perror(“setitimer error”);
exit(EXIT_FLURE);
}
/* 運行程序 */
while(1);
return 0;
}
在本例中,首先定義了一個setitimer結(jié)構(gòu)體變量value,用于設(shè)置時間間隔,以及定時器的初始值。
接著,我們注冊了一個信號處理函數(shù),用于處理SIGALRM信號。當(dāng)定時器時間到了,內(nèi)核會向進程發(fā)送該信號。
然后,使用setitimer函數(shù)開始計時。這時,ITIMER_REAL定時器開始工作,每隔3秒鐘就會向進程發(fā)送一個SIGALRM信號。
我們在程序中使用了一個無限循環(huán),確保程序一直保持運行狀態(tài)。
當(dāng)我們運行這個程序時,我們可以看到每隔三秒鐘,屏幕上就會出現(xiàn)一句“Hello, World!”。
4. setitimer函數(shù)的內(nèi)部實現(xiàn)原理
在Linux系統(tǒng)中,setitimer函數(shù)的內(nèi)部實現(xiàn)方式比較復(fù)雜。當(dāng)我們使用setitimer函數(shù)時,實際上是在向內(nèi)核發(fā)送一個SIGALRM、SIGVTALRM或SIGPROF信號,并設(shè)置該信號的處理方式。
在Linux內(nèi)核中,SIGALRM、SIGVTALRM和SIGPROF信號都有一個相應(yīng)的處理函數(shù)。當(dāng)該信號被觸發(fā)時,內(nèi)核會調(diào)用該信號的處理函數(shù)。在內(nèi)核中,定義了一個全局的定時器鏈表,用來存儲所有的定時器。
在進行setitimer函數(shù)調(diào)用時,內(nèi)核會將定時器信息加入到該鏈表中。定時器調(diào)用的順序是按照定時器時間順序排列的,因此,當(dāng)一個定時器時間到了,內(nèi)核會找到定時器鏈表中最早的定時器,并將該定時器的信息從鏈表中移除,然后觸發(fā)相應(yīng)的信號。
當(dāng)進程收到相應(yīng)的信號時,內(nèi)核會根據(jù)信號處理函數(shù)來處理該信號。在處理SIGALRM信號時,一般是通過alarm或setitimer函數(shù)來實現(xiàn)的。
5.
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù)!
Linux的kill函數(shù)和SIGUSR1信號。
那就什么也沒有發(fā)生啊。
對于這個信號而言,沒有信號響應(yīng)函數(shù)的話,進程應(yīng)該會異常終止,對于系統(tǒng)已有的信號一般都是有默認處理的,具體的我有點記不得了,搜下其實就知道了.我在網(wǎng)上找了下各信號默認處理方式,你看看吧,對你有沒有用
信號名稱 信號說明 默認處理
SIGABRT 由程序調(diào)用 abort時產(chǎn)生該信號。程序異常結(jié)束。 進程終止并且產(chǎn)生core文件
SIGALRM timer到期,有alarm或者setitimer 進程終止
SIGBUS 總線錯誤,地址沒對齊等。取決于具體硬件。 結(jié)束終止并產(chǎn)生core文件
SIGCHLD 進程停止或者終止時,父進程會收到該信號。 忽略該信號
SIGCONT 讓停止的進程繼續(xù)執(zhí)行繼續(xù)執(zhí)行或者忽略
SIGFPE 算術(shù)運算異常,除0等。進程終止并且產(chǎn)生core文件。
SIGHUP 終端關(guān)閉時產(chǎn)生這個信號 進程終止
SIGILL 代碼中有非法指令 進程終止并產(chǎn)生core文件
SIGINT 終端輸入了中斷字符ctrl+c進程終止
SIGIO 異步I/O,跟SIGPOLL一樣。 進程終止
SIGIOT 執(zhí)行I/O時產(chǎn)生硬件錯誤 進程終止并且產(chǎn)生core文件
SIGKILL 這個信號用戶不能去捕捉它。 進緩盯程終止
SIGPIPE 往管道寫時,讀者已經(jīng)不在了,或者往一個已斷開
數(shù)據(jù)流
socket寫數(shù)據(jù)。 進程終止
SIGPOLL 異步I/O,跟SIGIO一樣。 進程終止
SIGPROF 有setitimer設(shè)置的timer到期引發(fā) 。 進程終止
SIGPWR Ups電源切換時 進程終止
SIGQUIT Ctrl+\,不同于SIGINT,這個是會產(chǎn)生core dump文件的。 進伏悔程終止并且產(chǎn)生core文件
SIGSEGV 內(nèi)擾廳和存非法訪問,默認打印出segment fault 進程終止并且產(chǎn)生core文件
SIGSTOP 某個進程停止執(zhí)行,該信號不能被用戶捕捉。 進程暫停執(zhí)行
SIGSYS 調(diào)用操作系統(tǒng)不認識的系統(tǒng)調(diào)用。 進程終止并且產(chǎn)生core文件
SIGTERM 有kill函數(shù)調(diào)用產(chǎn)生。 進程終止
SIGTRAP 有調(diào)試器使用,gdb 進程終止并且產(chǎn)生core文件
SIGTSTP Ctrl+z,掛起進程。 進程暫停
SIGTTIN 后臺程序要從終端讀取成數(shù)據(jù)時。 進程暫停
SIGTTOU 后臺終端要把數(shù)據(jù)寫到終端時。 進程暫停
SIGURG 一些緊急的事件,比如從網(wǎng)絡(luò)收到帶外數(shù)據(jù)。 忽略
SIGUSR1 用戶自定義信號 進程終止
SIGUSR2 用戶自定義信號 進程終止
SIGVTALRM 有setitimer產(chǎn)生。 進程終止
使用struct itimerval做了一個定時器,現(xiàn)在我希望在執(zhí)行一些函數(shù)的時候停止計時,怎么處理?linux c語言
用setTimeout函數(shù)的時候會有一個梁兆升返回的id,你可以用一個id記錄一個setTimeout。id=setTimeout(“這里寫你的函猜巖數(shù)”,1000);然后當(dāng)你不用的時橡老候可以clearTimeout(id)釋放這個timer。
關(guān)于linux setitimer的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
四川成都云服務(wù)器租用托管【創(chuàng)新互聯(lián)】提供各地服務(wù)器租用,電信服務(wù)器托管、移動服務(wù)器托管、聯(lián)通服務(wù)器托管,云服務(wù)器虛擬主機租用。成都機房托管咨詢:13518219792
創(chuàng)新互聯(lián)(www.cdcxhl.com)擁有10多年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗、開啟建站+互聯(lián)網(wǎng)銷售服務(wù),與企業(yè)客戶共同成長,共創(chuàng)價值。
本文標題:「深入理解Linuxsetitimer函數(shù)」(linuxsetitimer)
URL標題:http://m.5511xx.com/article/cosispe.html


咨詢
建站咨詢
