版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)六 軟中斷信號及處理w實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)?zāi)康募由顚M(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別、進(jìn)一步認(rèn)識并發(fā)執(zhí)行的實(shí)質(zhì)了解并熟悉Linux系統(tǒng)中利用軟中斷信號實(shí)現(xiàn)進(jìn)程通信的基本概念及方法熟悉Linux提供的有關(guān)系統(tǒng)調(diào)用函數(shù)/庫函數(shù),并能使用這些函數(shù)w實(shí)驗(yàn)準(zhǔn)備及預(yù)習(xí)實(shí)驗(yàn)準(zhǔn)備及預(yù)習(xí)閱讀講義附件7-軟中斷信號及處理,了解Linux系統(tǒng)中利用軟中斷信號實(shí)現(xiàn)進(jìn)程通信的基本概念及方法熟悉Linux提供的有關(guān)系統(tǒng)調(diào)用函數(shù)/庫函數(shù):alarm()、kill()、signal()、sleep()、pause()Linux的低級通信wLinux的低級通信主要用來傳遞進(jìn)程間的控制信號,主要是文件鎖和軟中斷信號機(jī)制w軟中斷信
2、號的目的是通知對方發(fā)生了異步事件w信號是異步的,一個(gè)進(jìn)程不必通過任何操作來等待信號的到達(dá),事實(shí)上,進(jìn)程也不知道信號到底什么時(shí)候到達(dá)w信號是在軟件層次上對中斷機(jī)制的一種模擬w與硬中斷處理程序不一致的是收到硬中斷信號后中斷處理程序立即被啟動,軟中斷處理程序必須等到接收進(jìn)程運(yùn)行時(shí)才啟動進(jìn)程可向自己發(fā)送軟中斷信號,以便在某些意外情況下,進(jìn)程能轉(zhuǎn)入規(guī)定好的處理程序。例如,大部分陷阱都是由當(dāng)前進(jìn)程自己向自己發(fā)送一個(gè)軟中斷信號而立即轉(zhuǎn)入相應(yīng)處理的w信號事件的發(fā)生有兩個(gè)來源硬件來源,比如我們按下了鍵盤或者其它硬件故障軟件來源,最常用發(fā)送信號的系統(tǒng)函數(shù)是kill, raise, alarm和setitimer以
3、及sigqueue函數(shù),軟件來源還包括一些非法運(yùn)算等操作wLinux中有30個(gè)軟中斷信號和31個(gè)實(shí)時(shí)軟中斷信號常見軟中斷信號wSIGHUP從終端上發(fā)出的結(jié)束信號wSIGINT來自鍵盤的中斷信號wSIGQUIT來自鍵盤的退出信號wSIGFPE浮點(diǎn)異常信號wSIGALRM時(shí)鐘定時(shí)信號w忽略該信號w執(zhí)行系統(tǒng)默認(rèn)動作w捕捉信號信號處理的一般方法信號SIGKILL和SIGSTOP既不能被捕捉,也不能被忽略w為了給用戶進(jìn)程也提供相應(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()用于父子進(jìn)程之間的同步,而sleep則使得當(dāng)前進(jìn)程睡眠n秒后自動喚醒自己系統(tǒng)調(diào)用kill( pid, sig )和signal( sig, func )被用來傳遞和接收中斷信號例:signal( SIGINT, SIG_IGN ),表示當(dāng)前進(jìn)程忽略鍵盤中斷信號的影響 發(fā)送信號w常用于發(fā)送信號的系統(tǒng)函數(shù)是kill、raise和alarmwkill()函數(shù)()函數(shù)功能:傳送信號給指定的進(jìn)程語法格式:#include#includeint kill(pid_t pid,int sig);函數(shù)說明:kill()可以用來送參數(shù) sig 指定的信號給參數(shù) pid 指
5、定的進(jìn)程,參數(shù) pid一般0(將信號傳給進(jìn)程識別碼為 pid 的進(jìn)程)返回值:執(zhí)行成功則返回0;如果有錯(cuò)誤則返回-1 #include #include #include #include #include #include int main() pid_t pid; pid=fork(); if(pid0) perror(fork() errorn); if(pid=0) /*子進(jìn)程*/ printf(child process wait for signal!n); pause(); /*掛起進(jìn)程直至捕捉到一個(gè)信號*/ else /*父進(jìn)程*/ sleep(3); kill(pid,SIG
6、KILL);/*向子進(jìn)程發(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ù)參數(shù):seconds的值是秒數(shù),經(jīng)過了指定的seconds秒后會產(chǎn)生信號SIGALRM說明:設(shè)置一個(gè)時(shí)間值(鬧鐘時(shí)間),在將來的某個(gè)時(shí)刻該時(shí)間值會
7、被超過。當(dāng)所設(shè)置的時(shí)間值被超過后,產(chǎn)生SIGALRM信號如果不忽略或不捕捉此信號,則其默認(rèn)動作是終止該進(jìn)程每個(gè)進(jìn)程只能有一個(gè)鬧鐘時(shí)間。如果在調(diào)用alarm時(shí),以前已為該進(jìn)程設(shè)置過鬧鐘時(shí)間,而且它還沒有超時(shí),則該鬧鐘時(shí)間的余留值作為本次alarm函數(shù)調(diào)用的值返回。以前登記的鬧鐘時(shí)間則被新值代換 #include#include#include int main() int ret;alarm(50); sleep(30); /*使進(jìn)程睡眠30秒,期間要放棄CPU*/ret=alarm(10); printf(%dn,ret); pause(); /*使調(diào)用進(jìn)程掛起直至捕捉到一個(gè)信號*/ prin
8、tf(I have been waken up.n,ret); 捕捉信號w當(dāng)信號發(fā)出后,可以使用signal()方法捕獲信號wsignal()函數(shù)()函數(shù)語法格式:#include ;signal(int sig, void function() );功能:允許調(diào)用進(jìn)程控制軟中斷信號的處理,以非阻塞方式定義當(dāng)某信號到達(dá)時(shí)如何處理sig指明了所要處理的信號類型,可以取除了SIGKILL和SIGSTOP外的任何一種信號,例如:SIGHVP掛起SIGINT鍵盤按ctrl+cSIGQUIT鍵盤按quit鍵SIGFPE浮點(diǎn)運(yùn)算溢出SIGKILL要求終止進(jìn)程function描述了與信號關(guān)聯(lián)的動作,可以取以
9、下三種值:SIG_DFL:缺省操作,除SIGPWR、SIGCLD外所有信號的缺省操作是進(jìn)程終結(jié)SIG_IGN:忽視該信號的出現(xiàn)Function:該進(jìn)程中的一個(gè)函數(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); /*使進(jìn)程睡眠30秒,期間要放棄CPU*/ret=alarm(10); printf(%dn,ret); signal(SIGALRM, msg);pause(); /*使調(diào)用進(jìn)程掛起直至捕捉到一個(gè)信號*/ printf(I have been waken up.n,ret); void msg() printf(“catched a alarm signal!n); 下面給出一個(gè)軟中斷信號使用的程序?qū)崿F(xiàn)例:使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)子進(jìn)程,再使用系統(tǒng)調(diào)用signal()讓父進(jìn)程捕捉鍵盤上來的中斷信號(即按下Ctrl-C鍵);捕捉到中斷信號后父進(jìn)程用系統(tǒng)調(diào)用kill()向
11、兩個(gè)子進(jìn)程發(fā)出終止信號,子進(jìn)程捕捉到終止信號后輸出“child process n is killed by parent!”并終止。父進(jìn)程等待兩個(gè)子進(jìn)程終止后,輸出如下信息后結(jié)束運(yùn)行:“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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于VR的沉浸式廣告體驗(yàn)-深度研究
- 2025至2031年中國打孔墊底紙行業(yè)投資前景及策略咨詢研究報(bào)告
- 容器性能分析-深度研究
- 基于機(jī)器學(xué)習(xí)的入侵檢測技術(shù)-深度研究
- 基因表達(dá)的晝夜節(jié)律調(diào)控網(wǎng)絡(luò)-深度研究
- 2025至2030年中國微機(jī)自控淬火爐數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國尼龍復(fù)合材料PA數(shù)據(jù)監(jiān)測研究報(bào)告
- 二零二四年度音樂劇演出活動委托合同協(xié)議3篇
- 2025年中國嬰兒保溫箱市場調(diào)查研究報(bào)告
- 2025年度個(gè)人失業(yè)保險(xiǎn)代繳服務(wù)協(xié)議范本3篇
- 物業(yè)民法典知識培訓(xùn)課件
- 2023年初中畢業(yè)生信息技術(shù)中考知識點(diǎn)詳解
- 2024-2025學(xué)年八年級數(shù)學(xué)人教版上冊寒假作業(yè)(綜合復(fù)習(xí)能力提升篇)(含答案)
- 《萬方數(shù)據(jù)資源介紹》課件
- 醫(yī)生定期考核簡易程序述職報(bào)告范文(10篇)
- 第一章-地震工程學(xué)概論
- 《中國糖尿病防治指南(2024版)》更新要點(diǎn)解讀
- 初級創(chuàng)傷救治課件
- 交通運(yùn)輸類專業(yè)生涯發(fā)展展示
- 2024年山東省公務(wù)員錄用考試《行測》試題及答案解析
- 神經(jīng)重癥氣管切開患者氣道功能康復(fù)與管理專家共識(2024)解讀
評論
0/150
提交評論