Linux進(jìn)程的定時(shí)器設(shè)置及進(jìn)程控制_第1頁
Linux進(jìn)程的定時(shí)器設(shè)置及進(jìn)程控制_第2頁
Linux進(jìn)程的定時(shí)器設(shè)置及進(jìn)程控制_第3頁
Linux進(jìn)程的定時(shí)器設(shè)置及進(jìn)程控制_第4頁
Linux進(jìn)程的定時(shí)器設(shè)置及進(jìn)程控制_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Linux 進(jìn)程的定時(shí)器設(shè)置及進(jìn)程控制1 進(jìn)程生命周期進(jìn)程是程序的一次運(yùn)行,是一個(gè)動(dòng)態(tài)的過程。 進(jìn)程因創(chuàng)建而產(chǎn)生, 因結(jié)束而消亡, 進(jìn)程的運(yùn)行是時(shí)間和空間的結(jié)合。在進(jìn)程執(zhí)行的期間需要對(duì)進(jìn)程的執(zhí)行時(shí)間加以控制,從而控制進(jìn)程的執(zhí)行過程,這需要使用定時(shí)器和信號(hào)2 定時(shí)器 定時(shí)器就像日常生活中使用的鬧鐘,可以設(shè)置一個(gè)時(shí)間,進(jìn)程運(yùn)行到規(guī)定的時(shí)間, “鬧 鐘”就會(huì)觸發(fā),而進(jìn)程就可以被觸發(fā)去做一個(gè)特定的工作。對(duì)進(jìn)程進(jìn)行時(shí)間上的控制最簡(jiǎn)單的是使用 sleep()系統(tǒng)調(diào)用,使進(jìn)程“睡眠上一段時(shí)間”, 但是這種方法功能單一, Linux 提供了另外兩個(gè)系統(tǒng)調(diào)用來作為進(jìn)程運(yùn)行中的定時(shí)器, alarm() 和 set

2、itimer() 。2.1 sleep(系統(tǒng)調(diào)用函數(shù)原型#include <unistd.h> unsigned int sleep(unsigned int seconds);sleep()系統(tǒng)調(diào)用的功能是使得當(dāng)前進(jìn)程“睡眠”指定的時(shí)間(秒) 。參數(shù)seco nds即為指 定的秒數(shù)。2.2 alarm()系統(tǒng)調(diào)用函數(shù)原型: #include <unistd.h> unsigned int alarm(unsigned int seconds); alarm()用來設(shè)置信號(hào) SIGALRM在經(jīng)過參數(shù)seco nds指定的秒數(shù)后傳送給目前的進(jìn)程。如果參數(shù)seco nds為

3、0,則之前設(shè)置的鬧鐘會(huì)被取消,并將剩下的時(shí)間返回。 返回值 : 返回之前鬧鐘的剩余秒數(shù),如果之前未設(shè)鬧鐘則返回 0。 alarm()執(zhí)行后,進(jìn)程將繼續(xù)執(zhí)行,在alarm以后的執(zhí)行過程中將會(huì)在設(shè)定的秒數(shù)后收到信號(hào) SIGALRM ,并執(zhí)行其處理函數(shù)。2.3 setitimer()系統(tǒng)調(diào)用函數(shù)原型: #include <sys/time.h> int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);strcut timevallong tv_sec; /* 秒*/long tv_

4、usec; /* 微秒 */;struct itimervalstruct timeval it_interval; /* 時(shí)間間隔 */struct timeval it_value; /* 當(dāng)前時(shí)間計(jì)數(shù) */ ;setitimer()支持3種類型的定時(shí)器:ITIMER_REAL :實(shí)時(shí)定時(shí)器,不管進(jìn)程在何種模式下運(yùn)行(甚至在進(jìn)程被掛起時(shí))它總在計(jì)數(shù)。定時(shí)到達(dá),向進(jìn)程發(fā)送 SIGALRM 信號(hào)。ITIMER_VIRTUAL :這個(gè)不是實(shí)時(shí)定時(shí)器,當(dāng)進(jìn)程在用戶模式(即程序執(zhí)行時(shí))計(jì)算 進(jìn)程執(zhí)行的時(shí)間。定時(shí)到達(dá)后向該進(jìn)程發(fā)送 SIGVTALRM 信號(hào)。ITIMER_PROF :進(jìn)程在用戶模式(即

5、程序執(zhí)行時(shí))和核心模式(即進(jìn)程調(diào)度用時(shí))均 計(jì)數(shù)。定時(shí)到達(dá)產(chǎn)生 SIGPROF 信號(hào)。 ITIMER_PROF 記錄的時(shí)間比 ITIMER_VIRTUAL 多 了進(jìn)程調(diào)度所花的時(shí)間。setitimer() 第一個(gè)參 數(shù) which 的取值可以 是三種 定 時(shí)器 類型 中的任意 一種, 即 ITIMER_REAL 、 ITIMER_VIRTUAL 或 ITIMER_PROF 中的任一個(gè)。第二個(gè)參數(shù)是結(jié)構(gòu) itimerval 的一個(gè)實(shí)例,第三個(gè)參數(shù)可不做處理。元素 it_value 設(shè)置成為首次間隔的時(shí)間長(zhǎng)度, it_value 是重設(shè)的時(shí)間間隔長(zhǎng)度。 setitimer() 系統(tǒng)調(diào)用按照參數(shù) v

6、alue 的值設(shè)置定時(shí)器,如果參數(shù) ovalue 存在,則存放定時(shí)器的舊值。定時(shí)器將 it_value 的值遞減,遞減到 0 時(shí)就發(fā)出信號(hào),然后用 it_interval 的值重新設(shè)置 定時(shí)器。如果定時(shí)器的值被設(shè)置為0,那么這個(gè)定時(shí)器停止。setitimer() 調(diào)用成功返回 0,否則返回 -1。2.4 其他系統(tǒng)調(diào)用Linux 進(jìn)程中定時(shí)器的使用需要其他一些系統(tǒng)調(diào)用的配合。sig nal()系統(tǒng)調(diào)用:#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighand

7、ler_t handler);signal 系統(tǒng)調(diào)用用來說明對(duì)信號(hào)的處理方法。 signum 參數(shù)用來指定信號(hào), handler 可以 是信號(hào)處理函數(shù)或則兩個(gè)特殊值之一:SIG_IGN表示忽略信號(hào)SIG_DFl表示將信號(hào)恢復(fù)為默認(rèn)處理如果參數(shù) handler 是信號(hào)處理函數(shù),則 signal 會(huì)在收到信號(hào)后調(diào)用該函數(shù),我們可以形 象的稱為信號(hào)注冊(cè)處理函數(shù)。pause()系統(tǒng)調(diào)用#include <unistd.h>int pause(void);pause調(diào)用會(huì)使得進(jìn)程掛起直到有信號(hào)遞達(dá)。如果信號(hào)的處理動(dòng)作是終止進(jìn)程,則進(jìn)程 終止,pause函數(shù)沒有機(jī)會(huì)返回;如果信號(hào)的處理動(dòng)作是忽

8、略,則進(jìn)程繼續(xù)處于掛起狀態(tài), pause不返回;如果信號(hào)的處理動(dòng)作是捕捉,則調(diào)用了信號(hào)處理函數(shù)之后pause返回-1,errno設(shè)置為EINTR,所以pause只有出錯(cuò)的返回值。錯(cuò)誤碼 EINTR表示“被信號(hào)中斷”。3 使用實(shí)例3.1 使用 sleep()使用sleep()系統(tǒng)調(diào)用可以實(shí)現(xiàn)對(duì)進(jìn)程的簡(jiǎn)單控制,下面的代碼演示的使用方法。#include <unistd.h>#include <stdio.h>Void newWork();Void oldWork();void main()oldWork();sleep(10);newWork();Void oldWork(

9、)printf( “Iam now doing old work, then I will sleep. ”);Void newWork()printf( “now I am wake up. I will do new work ”);上面的這段代碼中可以看到,進(jìn)程首先運(yùn)行 oldWork() ,隨后“睡眠”了 10 秒鐘,然后 才開始運(yùn)行 newWork() ,進(jìn)程的運(yùn)行有了 10 秒的時(shí)間延遲。3.2 使用 alarm()以下示例程序就是利用 alarm ()系統(tǒng)調(diào)用來實(shí)現(xiàn)程序?qū)φ{(diào)用的子程序的運(yùn)行時(shí)間加以 控制。#include <stdio.h>#include <u

10、nistd.h>#include<sys/types.h>#include<signal.h>void sig_alrm1(int);void sig_alrm2(int);void func();int main(void) signal(SIGALRM,sig_alrm1/ 注冊(cè) SIGALRM 信號(hào)的處理函數(shù) alarm(5);/*SIGALRM 信號(hào)會(huì)在 5 秒鐘后發(fā)送給當(dāng)前的進(jìn)程 */ func(); /* 進(jìn)程轉(zhuǎn)去處理函數(shù) func()*/return 0;void sig_alrm1(int signo)/*SIGALRM 信號(hào)的處理函數(shù) */ pr

11、intf("SIGALRM signal is cathced by sig_alrm1n"); printf("the function overtime,an the procress will be quit!n"); _exit(0);void sig_alrm2(int signo)/*SIGALRM 信號(hào)的第二個(gè)處理函數(shù) */ printf("function completed!n");printf("And signal_alrm2 deal with the SIGALRM signal!n");

12、 _exit(0);void func()/* 需要進(jìn)行時(shí)間控制的函數(shù) */ printf("A function is running now!n"); sleep(10);signal(SIGALRM,sig_alrm2);運(yùn)行程序:A function is running now! /*程序運(yùn)行時(shí)會(huì)在這停留5秒鐘*/SIGALRM signal is cathced by sig_alrm1 the function overtimesn the procress will be quit! 程序首先用signal()聲明了 SIGALRM信號(hào)處理函數(shù)為 sig_a

13、lrm1 () , alarm系統(tǒng)調(diào)用的 參數(shù)是5,說明進(jìn)程會(huì)在5秒鐘后收到內(nèi)核發(fā)送給自己的 SIGALRM信號(hào),但是在此處會(huì)繼 續(xù)向下運(yùn)行,然后進(jìn)程調(diào)用一個(gè)函數(shù)func(),如果函數(shù)func()不能在5秒鐘內(nèi)結(jié)束,則進(jìn)程會(huì)在收到 SIGALRM 信號(hào)(為了區(qū)別,我們不妨稱為SIG_ALARM),因?yàn)槲覀円呀?jīng)為SIGALRM信號(hào)注冊(cè)了信號(hào)處理函數(shù)sig_alrm1,因而此時(shí)會(huì)調(diào)用sig_alarm1函數(shù),打印出相應(yīng)的內(nèi)容,sig_alarm1函數(shù)最后會(huì)調(diào)用_exit(0)來結(jié)束進(jìn)程。如果函數(shù)func()在5秒鐘內(nèi)結(jié)束, 則函數(shù)func()在最后執(zhí)行了語句 signal(SIGALRM,sig_

14、alrm2),將信號(hào)SIGALRM 的處理函數(shù) 改為sig_alrm2,而后一次signal系統(tǒng)調(diào)用會(huì)覆蓋前一次 signal系統(tǒng)調(diào)用的效果,所以如果調(diào) 用函數(shù)func()在五秒內(nèi)結(jié)束,然后又收到SIG_ALARM 信號(hào)(此處我們稱為 SIG_ALARM, 雖然是同一個(gè)信號(hào)),那么這時(shí)就會(huì)調(diào)用 sig_alrm2函數(shù)對(duì)信號(hào)進(jìn)程處理。在上面的代碼中, 函數(shù)func()內(nèi)使用了 sleep()系統(tǒng)調(diào)用使得函數(shù)睡眠了10秒,因此運(yùn)行中收到的信號(hào)是SIG_ALARM,所以調(diào)用的信號(hào)處理函數(shù)是 sig_alrm1(),這種進(jìn)程控制的模型如圖1所示:圖1進(jìn)程控制模型圖3.3 使用 setitimer()s

15、etitimer()系統(tǒng)調(diào)用的使用方式同alarm()非常類似,同樣是首先設(shè)置間隔時(shí)間,待到時(shí)間用完,向進(jìn)程發(fā)送信號(hào),進(jìn)程可以捕獲信號(hào),根據(jù)sig nal()系統(tǒng)調(diào)用的設(shè)計(jì)對(duì)信號(hào)進(jìn)行處理(默認(rèn)、忽略或調(diào)用其他函數(shù))。與alarm()系統(tǒng)調(diào)用不同的是,alarm()系統(tǒng)調(diào)用設(shè)置后只能使用一次,若想多次使用就 需要多次設(shè)置,而setitimer()系統(tǒng)調(diào)用可以進(jìn)行自動(dòng)重復(fù)設(shè)置。#i nclude <stdio.h>#in clude <uni std.h>#in clude <sig nal.h> #in clude <stri ng.h> #i n

16、clude <sys/time.h> void prin tMsg(i nt); int mai n() int res = 0;signal(SIGALRM, printMsg);struct itimerval tick;memset(&tick, 0, sizeof(tick);/ Timeout to run function first time tick.it_value.tv_sec = 2; / sec tick.it_value.tv_usec = 0; / micro sec./ Interval time to run function tick.it

17、_interval.tv_sec = 3; tick.it_interval.tv_usec = 0;/ Set timer, ITIMER_REAL : real-time to decrease timer,/ send SIGALRM when timeoutres = setitimer(ITIMER_REAL, &tick, NULL);if (res) printf("Set timer failed!n");while(1) pause();return 0;void printMsg(int num) printf("%s",&q

18、uot;Hello World!n");程序首先設(shè)置首次間隔時(shí)間( tick.it_value ),時(shí)間設(shè)置為 2 秒 0 毫秒,然后設(shè)置重置時(shí) 間間隔( tick.it_interval ),時(shí)間為 3 秒 0 毫秒。進(jìn)程開始運(yùn)行,首先為信號(hào) SIGALRM 注冊(cè) 處理函數(shù),即一旦收到信號(hào) SIGALRM ,就會(huì)調(diào)用函數(shù) printMsg() 。然后調(diào)用 setitimer() 系統(tǒng) 調(diào)用設(shè)置定時(shí)器, setitimer() 完成后,進(jìn)程不會(huì)停下等待信號(hào),而是繼續(xù)向下執(zhí)行。所以進(jìn) 程繼續(xù)執(zhí)行pause()系統(tǒng)調(diào)用,等待信號(hào)到來。進(jìn)程會(huì)在開始運(yùn)行2秒0毫秒后,收到內(nèi)核發(fā)來的 SIGALRM 信號(hào)(因?yàn)槎〞r(shí)器類型是 ITIMER_REAL ),然后捕獲該信號(hào),調(diào)用信號(hào) 處理函數(shù) printMsg() ,打印出相關(guān)信息。 然后進(jìn)程會(huì)使用 ti

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論