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

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


咨詢
建站咨詢
