操作系統(tǒng)實驗,實驗6 軟中斷信號及處理_第1頁
操作系統(tǒng)實驗,實驗6 軟中斷信號及處理_第2頁
操作系統(tǒng)實驗,實驗6 軟中斷信號及處理_第3頁
操作系統(tǒng)實驗,實驗6 軟中斷信號及處理_第4頁
操作系統(tǒng)實驗,實驗6 軟中斷信號及處理_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗六 軟中斷信號及處理w實驗?zāi)康膶嶒災(zāi)康募由顚M程概念的理解,明確進程和程序的區(qū)別、進一步認識并發(fā)執(zhí)行的實質(zhì)了解并熟悉Linux系統(tǒng)中利用軟中斷信號實現(xiàn)進程通信的基本概念及方法熟悉Linux提供的有關(guān)系統(tǒng)調(diào)用函數(shù)/庫函數(shù),并能使用這些函數(shù)w實驗準備及預(yù)習(xí)實驗準備及預(yù)習(xí)閱讀講義附件7-軟中斷信號及處理,了解Linux系統(tǒng)中利用軟中斷信號實現(xiàn)進程通信的基本概念及方法熟悉Linux提供的有關(guān)系統(tǒng)調(diào)用函數(shù)/庫函數(shù):alarm()、kill()、signal()、sleep()、pause()Linux的低級通信wLinux的低級通信主要用來傳遞進程間的控制信號,主要是文件鎖和軟中斷信號機制w軟中斷信

2、號的目的是通知對方發(fā)生了異步事件w信號是異步的,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知道信號到底什么時候到達w信號是在軟件層次上對中斷機制的一種模擬w與硬中斷處理程序不一致的是收到硬中斷信號后中斷處理程序立即被啟動,軟中斷處理程序必須等到接收進程運行時才啟動進程可向自己發(fā)送軟中斷信號,以便在某些意外情況下,進程能轉(zhuǎn)入規(guī)定好的處理程序。例如,大部分陷阱都是由當前進程自己向自己發(fā)送一個軟中斷信號而立即轉(zhuǎn)入相應(yīng)處理的w信號事件的發(fā)生有兩個來源硬件來源,比如我們按下了鍵盤或者其它硬件故障軟件來源,最常用發(fā)送信號的系統(tǒng)函數(shù)是kill, raise, alarm和setitimer以

3、及sigqueue函數(shù),軟件來源還包括一些非法運算等操作wLinux中有30個軟中斷信號和31個實時軟中斷信號常見軟中斷信號wSIGHUP從終端上發(fā)出的結(jié)束信號wSIGINT來自鍵盤的中斷信號wSIGQUIT來自鍵盤的退出信號wSIGFPE浮點異常信號wSIGALRM時鐘定時信號w忽略該信號w執(zhí)行系統(tǒng)默認動作w捕捉信號信號處理的一般方法信號SIGKILL和SIGSTOP既不能被捕捉,也不能被忽略w為了給用戶進程也提供相應(yīng)的同步、互斥以及軟中斷通信功能,Linux系統(tǒng)提供了幾種相應(yīng)的系統(tǒng)調(diào)用或庫函數(shù)文件鎖函數(shù)lockf(fd, function, size)可用于互斥用于同步的系統(tǒng)調(diào)用是wait

4、()或sleep(n),其中wait()用于父子進程之間的同步,而sleep則使得當前進程睡眠n秒后自動喚醒自己系統(tǒng)調(diào)用kill( pid, sig )和signal( sig, func )被用來傳遞和接收中斷信號例:signal( SIGINT, SIG_IGN ),表示當前進程忽略鍵盤中斷信號的影響 發(fā)送信號w常用于發(fā)送信號的系統(tǒng)函數(shù)是kill、raise和alarmwkill()函數(shù)()函數(shù)功能:傳送信號給指定的進程語法格式:#include#includeint kill(pid_t pid,int sig);函數(shù)說明:kill()可以用來送參數(shù) sig 指定的信號給參數(shù) pid 指

5、定的進程,參數(shù) pid一般0(將信號傳給進程識別碼為 pid 的進程)返回值:執(zhí)行成功則返回0;如果有錯誤則返回-1 #include #include #include #include #include #include int main() pid_t pid; pid=fork(); if(pid0) perror(fork() errorn); if(pid=0) /*子進程*/ printf(child process wait for signal!n); pause(); /*掛起進程直至捕捉到一個信號*/ else /*父進程*/ sleep(3); kill(pid,SIG

6、KILL);/*向子進程發(fā)送SIGKILL信號*/ printf(parent send signal to kill child!n); waitpid(pid,NULL,0); /*等待pid退出*/ printf(child process exit!n); exit(0); walarm()()語法格式:#include unsigned int alarm(unsigned int seconds) ;返回:0或以前設(shè)置的鬧鐘時間的余留秒數(shù)參數(shù):seconds的值是秒數(shù),經(jīng)過了指定的seconds秒后會產(chǎn)生信號SIGALRM說明:設(shè)置一個時間值(鬧鐘時間),在將來的某個時刻該時間值會

7、被超過。當所設(shè)置的時間值被超過后,產(chǎn)生SIGALRM信號如果不忽略或不捕捉此信號,則其默認動作是終止該進程每個進程只能有一個鬧鐘時間。如果在調(diào)用alarm時,以前已為該進程設(shè)置過鬧鐘時間,而且它還沒有超時,則該鬧鐘時間的余留值作為本次alarm函數(shù)調(diào)用的值返回。以前登記的鬧鐘時間則被新值代換 #include#include#include int main() int ret;alarm(50); sleep(30); /*使進程睡眠30秒,期間要放棄CPU*/ret=alarm(10); printf(%dn,ret); pause(); /*使調(diào)用進程掛起直至捕捉到一個信號*/ prin

8、tf(I have been waken up.n,ret); 捕捉信號w當信號發(fā)出后,可以使用signal()方法捕獲信號wsignal()函數(shù)()函數(shù)語法格式:#include ;signal(int sig, void function() );功能:允許調(diào)用進程控制軟中斷信號的處理,以非阻塞方式定義當某信號到達時如何處理sig指明了所要處理的信號類型,可以取除了SIGKILL和SIGSTOP外的任何一種信號,例如:SIGHVP掛起SIGINT鍵盤按ctrl+cSIGQUIT鍵盤按quit鍵SIGFPE浮點運算溢出SIGKILL要求終止進程function描述了與信號關(guān)聯(lián)的動作,可以取以

9、下三種值:SIG_DFL:缺省操作,除SIGPWR、SIGCLD外所有信號的缺省操作是進程終結(jié)SIG_IGN:忽視該信號的出現(xiàn)Function:該進程中的一個函數(shù)地址#include#includevoid handler() printf(hellon);int main()int i;signal(SIGALRM,handler);alarm(5);for(i=1;i7;i+)printf(sleep %d .n,i);sleep(1);#include#include#include #includevoid msg();int main() int ret;alarm(50); sle

10、ep(30); /*使進程睡眠30秒,期間要放棄CPU*/ret=alarm(10); printf(%dn,ret); signal(SIGALRM, msg);pause(); /*使調(diào)用進程掛起直至捕捉到一個信號*/ printf(I have been waken up.n,ret); void msg() printf(“catched a alarm signal!n); 下面給出一個軟中斷信號使用的程序?qū)崿F(xiàn)例:使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個子進程,再使用系統(tǒng)調(diào)用signal()讓父進程捕捉鍵盤上來的中斷信號(即按下Ctrl-C鍵);捕捉到中斷信號后父進程用系統(tǒng)調(diào)用kill()向

11、兩個子進程發(fā)出終止信號,子進程捕捉到終止信號后輸出“child process n is killed by parent!”并終止。父進程等待兩個子進程終止后,輸出如下信息后結(jié)束運行:“parent process is killed!”。 #include #include #include void waiting() while(wait_mark!=0); void stop() wait_mark=0; void keep_alive() int main()int p1,p2;while(p1=fork()=-1);if(p10)while(p2=fork()=-1);if(p20) printf(“parentn”); wait_mark=1; signal(SIGINT, stop); /*接收Ctrl-C*/ waiting(); kill(p1, SIGINT); kill(p2, SIGINT); wait(0); wait(0); printf(“parent process is killed!n”); exit(0); elsepr

溫馨提示

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

評論

0/150

提交評論