




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、UNIX_的信號處理一、實(shí)驗要求一、實(shí)驗要求 本實(shí)驗要求利用可靠信號機(jī)制解決信號本實(shí)驗要求利用可靠信號機(jī)制解決信號處理時可能出現(xiàn)的時間窗口,以及非局部轉(zhuǎn)處理時可能出現(xiàn)的時間窗口,以及非局部轉(zhuǎn)移等問題,將學(xué)習(xí)使用移等問題,將學(xué)習(xí)使用sigaction,alarm,sigpending,sigsetjmp和和siglongjmp等函等函數(shù)解決在處理信號時遇到的問題。數(shù)解決在處理信號時遇到的問題。二、實(shí)驗思路二、實(shí)驗思路1. 1. 一個方便的開始:一個方便的開始:在程序清單在程序清單1-81-8的基礎(chǔ)上進(jìn)行修改。的基礎(chǔ)上進(jìn)行修改。可以直接利用系統(tǒng)可以直接利用系統(tǒng)shellshell(在(在cs8cs
2、8是是bashbash):):execl(“/bin/sh”, “sh”, “-c”, buf, (char execl(“/bin/sh”, “sh”, “-c”, buf, (char * *) 0);) 0);這樣程序這樣程序sigtestsigtest就具有系統(tǒng)就具有系統(tǒng)shellshell的全部功能。如果命令帶的全部功能。如果命令帶“-t”-t”選項,則在創(chuàng)建執(zhí)行上面函數(shù)的子進(jìn)程之前,必須設(shè)選項,則在創(chuàng)建執(zhí)行上面函數(shù)的子進(jìn)程之前,必須設(shè)置鬧鐘;在子進(jìn)程結(jié)束之后,必須將鬧鐘清零。置鬧鐘;在子進(jìn)程結(jié)束之后,必須將鬧鐘清零。2. 2. 需要處理的信號:需要處理的信號: 因為需要使用鬧鐘,所
3、以實(shí)驗需要處理兩個信號:因為需要使用鬧鐘,所以實(shí)驗需要處理兩個信號:SIGALRMSIGALRM和和SIGQUITSIGQUIT。如果當(dāng)前程序正在執(zhí)行用戶命令,則信。如果當(dāng)前程序正在執(zhí)行用戶命令,則信號處理函數(shù)必須號處理函數(shù)必須“殺死殺死”用戶命令進(jìn)程:用戶命令進(jìn)程:kill(pid, SIGKILL);kill(pid, SIGKILL);/ pid/ pid為用戶命令進(jìn)程的為用戶命令進(jìn)程的IDID對于信號對于信號SIGQUITSIGQUIT還有一種可能:正在接收用戶輸入的命令還有一種可能:正在接收用戶輸入的命令串。此時需要放棄當(dāng)前輸入,重新開始接收輸入。解決方法串。此時需要放棄當(dāng)前輸入,重
4、新開始接收輸入。解決方法可能需要使用非局部轉(zhuǎn)移機(jī)制??赡苄枰褂梅蔷植哭D(zhuǎn)移機(jī)制。static volatile pid_t pid;/ 全局變量,存放執(zhí)行用戶命令全局變量,存放執(zhí)行用戶命令的子進(jìn)程的的子進(jìn)程的ID,/ 非非0表正在執(zhí)行用戶命令表正在執(zhí)行用戶命令設(shè)置信號設(shè)置信號SIGALRM處理方式的代碼(供參考):處理方式的代碼(供參考):struct sigactionact, oact;Act.sa_handler = func;/ 信號信號SIGALRM的處理函數(shù)的處理函數(shù)sigemptyset(&act.sa_mask);act.sa_mask |= SIGQUIT;/ 在處理
5、信號在處理信號SIGALRM時,屏蔽時,屏蔽信號信號SIGQUITact.sa_flags = 0;#ifdef SA_RESTAT / 如果定義了該常量,則系統(tǒng)默認(rèn)不如果定義了該常量,則系統(tǒng)默認(rèn)不重啟,應(yīng)改為重啟重啟,應(yīng)改為重啟act.sa_flags |= SA_RESTART;#endifsigaction(SIGALRM, &act, &oact);3. 信號信號SIGALRM和和SIGQUIT之間嵌套關(guān)系的處理之間嵌套關(guān)系的處理 如果這兩個信號同時發(fā)生,或者在處理信號如果這兩個信號同時發(fā)生,或者在處理信號SIGALRMSIGALRM時時產(chǎn)生信號產(chǎn)生信號SIGQUITS
6、IGQUIT(或者反過來),那么應(yīng)當(dāng)如何處理?無(或者反過來),那么應(yīng)當(dāng)如何處理?無論如何,如果同時存在多個未決信號,系統(tǒng)總是一個信號處論如何,如果同時存在多個未決信號,系統(tǒng)總是一個信號處理完了,再處理下一個信號,但是在處理完全部未決信號之理完了,再處理下一個信號,但是在處理完全部未決信號之前,不會返回被中斷的函數(shù)或系統(tǒng)調(diào)用。前,不會返回被中斷的函數(shù)或系統(tǒng)調(diào)用。 因此合理的處理方法是,無論上述兩個信號哪個先處理,因此合理的處理方法是,無論上述兩個信號哪個先處理,另一個未決信號就應(yīng)該忽略(清除未決信號);在處理其中另一個未決信號就應(yīng)該忽略(清除未決信號);在處理其中一個信號時,屏蔽另一個信號(如
7、果發(fā)生,就是未決信號)。一個信號時,屏蔽另一個信號(如果發(fā)生,就是未決信號)。信號信號SIGQUIT處理函數(shù)的末尾應(yīng)該包含如下代碼段(供參考處理函數(shù)的末尾應(yīng)該包含如下代碼段(供參考):):sigset_tpendmask;sigemptyset(&pendmask);sigpending(&pendmask);/ 獲得未決信號集合獲得未決信號集合pid = 0;/ 表示當(dāng)前無正在執(zhí)行的用戶命令表示當(dāng)前無正在執(zhí)行的用戶命令alarm(0);/ 清除鬧鐘清除鬧鐘if(sigsmember(&pendmask, SIGALRM) / 存在未決存在未決信號信號SIGALRMsi
8、gnal(SIGALRM, SIG_IGN); / 清除未決信號清除未決信號SIGALRMsigaction(SIGALRM, &act, NULL);/ 恢復(fù)原來的處理恢復(fù)原來的處理方法方法三、程序代碼三、程序代碼#include apue.h#includestatic void sig_int(int);static void sig_alrm(int);static volatile pid_t pid;/ 全局變量,存放執(zhí)行用戶命令全局變量,存放執(zhí)行用戶命令的子進(jìn)程的的子進(jìn)程的ID, 非非0表正在執(zhí)行用戶命令表正在執(zhí)行用戶命令static sigjmp_buf jmpbuf;
9、Sigfunc* signal(int signo,Sigfunc*func);int main(int argc,char*argv) char bufMAXLINE;int status; int time=0; if(argc=3) if(strcmp(argv1,-t)=0) time=atoi(argv2); else err_sys(input error!); printf(%); if(time) alarm(time); if(signal(SIGQUIT,sig_int)=SIG_ERR) err_sys(signal error!); if(signal(SIGALRM,
10、sig_alrm)=SIG_ERR) err_sys(signal error!); sigsetjmp(jmpbuf,1); printf(%); if(time) alarm(time);while(fgets(buf,MAXLINE,stdin)!=NULL) if(bufstrlen(buf)-1=n)bufstrlen(buf)-1=0; if(pid=fork()0) err_sys(fork error!); else if(pid=0) execl(/bin/sh,sh,-c,buf,(char*)0); err_ret(couldnt execute: %s,buf); ex
11、it(127); waitpid(pid,&status)pid=0; alarm(0); printf(%); exit(0); Sigfunc* signal(int signo,Sigfunc*func) /設(shè)置信號設(shè)置信號SIGALRM處理方式處理方式 struct sigaction act,oact; act.sa_handler=func; / 信號信號SIGALRM的處理函數(shù)的處理函數(shù) sigemptyset(&act.sa_mask); act.sa_flags=0;if(signo=SIGALRM) sigaddset(&act.sa_mask,SI
12、GQUIT); /這句話是經(jīng)高人指這句話是經(jīng)高人指點(diǎn)才寫出來的點(diǎn)才寫出來的 #ifdef SA_RESTART act.sa_flags|=SA_RESTART; #endif if (sigaction(SIGALRM,&act,&oact)0) kill(pid,SIGKILL); else printf(n); siglongjmp(jmpbuf,1); if(sigemptyset(&pendmask)0) err_sys(sigemptyset error!); if(sigpending(&pendmask)0) kill(pid,SIGKILL);
13、 if(sigemptyset(&pendmask)0) err_sys(sigemptyset error!); if(sigpending(&pendmask)0) err_sys(sigpending error!); if(sigismember(&pendmask,SIGQUIT) signal(SIGQUIT,SIG_IGN); signal(SIGQUIT,sig_int); siglongjmp(jmpbuf,1);四、實(shí)驗結(jié)果四、實(shí)驗結(jié)果源程序名:源程序名:myshell.c可執(zhí)行程序名:可執(zhí)行程序名:myshell編譯方法:編譯方法:gcc mysh
14、ell.c error2e.c o myshell 結(jié)束方法:結(jié)束方法:ctrl+c運(yùn)行過程:運(yùn)行過程:設(shè)了時間限制以后,會在限制時間到達(dá)后輸出設(shè)了時間限制以后,會在限制時間到達(dá)后輸出Time Out!,一旦在時間內(nèi)輸入命令,就會推出時間限制。一旦在時間內(nèi)輸入命令,就會推出時間限制。按下按下ctrl+c后退出后退出五、實(shí)驗總結(jié)五、實(shí)驗總結(jié) 本次實(shí)驗感覺難度比較大,本次實(shí)驗感覺難度比較大, 實(shí)驗要求對信號的處理有比實(shí)驗要求對信號的處理有比較深入的了解。題目中給出了實(shí)驗思路,但由于對信號處理較深入的了解。題目中給出了實(shí)驗思路,但由于對信號處理函數(shù)的不熟悉,對給出的函數(shù)理解起來也比較困難。另外,函數(shù)的不熟悉,對給出的函
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年食品加工機(jī)械項目規(guī)劃申請報告
- 教學(xué)設(shè)計教案課件
- 王老師教學(xué)初中英語課件
- 教學(xué)課件音標(biāo)
- 制圖課教學(xué)課件
- 橫書法教學(xué)課件
- 漫畫教學(xué)課件下載
- 教育技術(shù)課件封面設(shè)計
- 新公司團(tuán)隊活動方案
- 春日賞花團(tuán)建活動方案
- 福建省旋挖成孔灌注樁技術(shù)規(guī)程
- DL∕T 1057-2023 自動跟蹤補(bǔ)償消弧線圈成套裝置技術(shù)條件
- 北京2024年北京市公安局人工智能安全研究中心招聘筆試歷年典型考題及考點(diǎn)附答案解析
- 氣體分析儀檢定規(guī)程
- 2024-2029年吞咽困難飲食增稠劑行業(yè)市場現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃投資研究報告
- DZ/T 0430-2023 固體礦產(chǎn)資源儲量核實(shí)報告編寫規(guī)范(正式版)
- 小學(xué)數(shù)學(xué)研究專題
- HYT 104-2008 陶瓷微孔濾膜組件
- 2021年電梯檢驗員理論考試題庫
- 《太陽能發(fā)電》課件
- 《原發(fā)性高血壓》課件
評論
0/150
提交評論