信號的傳遞_徐波_第1頁
信號的傳遞_徐波_第2頁
信號的傳遞_徐波_第3頁
信號的傳遞_徐波_第4頁
信號的傳遞_徐波_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、信號的傳遞 徐波 Embedded System Lab 2014 信號傳遞 信號傳遞有兩個階段?信號傳遞有兩個階段? 信號產(chǎn)生:信號產(chǎn)生:內(nèi)核更新目標(biāo)進程的數(shù)據(jù)結(jié)構(gòu) 以表示一個新信號已被發(fā)送; 信號傳遞信號傳遞:內(nèi)核強迫目標(biāo)進程通過以下方 式對信號做出反應(yīng):或改變目標(biāo)進程的執(zhí) 行狀態(tài),或開始執(zhí)行一個特定的信號處理 程序,或者兩者都是。 已經(jīng)產(chǎn)生但還沒有傳遞的信號稱為掛起信號已經(jīng)產(chǎn)生但還沒有傳遞的信號稱為掛起信號 一、信號的傳遞-引言 假定內(nèi)核已經(jīng)注意到一個信號的到來,并 調(diào)用相應(yīng)的函數(shù)為接收此信號的進程準(zhǔn)備描 述符。但是萬一這個進程在那一刻并不在 CPU上運行,內(nèi)核就延遲傳遞信號的任務(wù)。 那

2、么我們現(xiàn)在就轉(zhuǎn)向另一個主題,即為確保確保 進程的掛起信號得到處理內(nèi)核所執(zhí)行的操作進程的掛起信號得到處理內(nèi)核所執(zhí)行的操作 。 二、檢查信號隊列的時間 內(nèi)核何時檢查信號隊列? 內(nèi)核在允許進程恢復(fù)用戶態(tài)下的執(zhí)行之前 ,會檢查進程TIF_SIGPENDING標(biāo)志的值 。(該標(biāo)志表示進程是否有非阻塞的掛起 信號,1為真) 每當(dāng)內(nèi)核處理完一個中斷或異常時,就檢 查是否存在掛起的信號。 三、處理掛起信號 如何處理非阻塞的掛起信號量?如何處理非阻塞的掛起信號量? 為了處理非阻塞的掛起信號,內(nèi)核調(diào)用 do_signal()函數(shù)進行處理; 阻塞信號阻塞信號:如果一個信號被設(shè)置為阻塞, 那么當(dāng)信號產(chǎn)生的時候,它會與

3、正常的信 號一樣被傳遞給進程,但是只有進程解除 對信號阻塞時才會被處理。 掛起信號掛起信號:已經(jīng)生成但是還未被傳遞的信 號。 掛起信號-略講 任何時候,一個進程僅存在給定類型的一個掛起信號一個進程僅存在給定類型的一個掛起信號,同 一進程同種類型的其他信號不被排隊,只被簡單的丟棄。 但是實時信號不同:同種類型的掛起信號可以有好幾個但是實時信號不同:同種類型的掛起信號可以有好幾個 信號的掛起時間長度往往不可預(yù)知信號的掛起時間長度往往不可預(yù)知,原因在于: 信號通常只被current進程傳遞 進程可以選擇阻塞某種信號進程可以選擇阻塞某種信號。這種情況下,在取消阻 塞之前進程將不接收這個信號 當(dāng)進程執(zhí)行

4、一個信號處理程序函數(shù)時,通常屏蔽相應(yīng) 的信號,即自動阻塞這個信號直到處理程序結(jié)束。因 此,所處理的信號的另一次出現(xiàn)不能中斷信號處理程 序 四、 do_signal()函數(shù) do_signal()函數(shù)接受兩個參數(shù):函數(shù)接受兩個參數(shù): regs:棧區(qū)的地址:棧區(qū)的地址,存放當(dāng)前進程在用戶狀態(tài)下寄存器的 內(nèi)容 oldset:變量的地址:變量的地址,假設(shè)存放阻塞信號的位掩碼數(shù)組, 如果沒有必要保存位掩碼數(shù)組,這它為NULL struct pt_regs *regs; /pt_regs結(jié)構(gòu),指向當(dāng)前進程 內(nèi)核態(tài)堆棧中保存的寄存器 sigset_t *oldset; /信號處理程序執(zhí)行時要屏蔽的信號 二、

5、檢查信號隊列的時間 時間:時間:通常只是在CPU要返回到用戶態(tài)時才被調(diào)用do_signal()函 數(shù)。 四 do_signal()函數(shù)的核心 do_signal()函數(shù)核心:函數(shù)核心: 循環(huán)調(diào)用dequeue_signal()函數(shù),直到在私有掛起隊 列和共享掛起隊列中都沒有非阻塞的掛起信號 dequeue_signal()函數(shù)首先考慮私有掛起隊列,并從 最低編號開始,然后再共享隊列;處理完后更新數(shù) 據(jù)結(jié)構(gòu)以表示信號不再掛起: 清位:currunt-pending.signal 此時程序?qū)雎栽撔盘?,處理隊列中的下一個信號 事實上,由于UNIX的歷史原因,要想不產(chǎn)生僵尸進程還有另外一種辦法:父

6、進程調(diào)用 sigaction將SIGCHLD的處理動作置為SIG_IGN,這樣fork出來的子進程在終止時會自動 清理掉,不會產(chǎn)生僵尸進程,也不會通知父進程。系統(tǒng)默認的忽略動作和用戶用 sigaction函數(shù)自定義的忽略通常是沒有區(qū)別的,但這是一個特例。此方法對于Linux可用 陳香蘭老師 能被忽略的信號能被忽略的信號 2、執(zhí)行缺省操作 (1)init進程:進程: if(currunt-pid=1) continue; (2)Ignore信號:信號: if(signr=SIGCONT| signr=SIGCHLD| signr=SIGURE| signr=SIGWINTH) continue;

7、 Signr: dequeue_signal()返回值,如果為0,則說明所有掛起的信號 已被處理完,否則還有掛起隊列等待處理。 (3)STOP信號:信號: if(signr=SIGSTOP| signr=SIGTSTP| signr=SIGTTIN| signr=SIGTTOUT)) if(signr!=SIGSTOP do_signal_stop(signr); SIGSTOP總是停止線程組,其它只停止不在不在孤兒進程的線程組 do_signal_stop()檢查currunt是否是線程組中第一個被停止的進程第一個被停止的進程,是則激 活“組停止”; 將進程狀態(tài)置為TASK_STOPPED,并調(diào)用schedule(); 如果線程組組長的父進程沒有設(shè)置SIGCHLD的SA_NOCLDSTOP標(biāo)志,則向他發(fā)送 SIGCHLD信號! 根據(jù)信號的類型,根據(jù)信號的類型, 使用使用switch語句語句 找到對應(yīng)的缺省找到對應(yīng)的缺省 處理方式處理方式 (4)DUMP信號:信號:進程被殺死 進進程的工作目錄創(chuàng)建一個“轉(zhuǎn)儲”文件,

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論