日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
「深入理解Linuxsetitimer函數(shù)」(linuxsetitimer)

深入理解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