1、訊號:乙個很短的訊息,可以被傳送到乙個或一組程序,通常是乙個數,以此來標識訊號。
2、1-31編碼了常規訊號(不排隊,連續傳送多次,只有乙個有效);32-64編碼了實時訊號(必須排隊,以便接受多個訊號)
3、訊號:隨時被傳送給乙個狀態不可預知的程序,傳送給非執行程序必須有核心儲存,直到程序恢復執行。阻塞乙個訊號要求傳遞拖延,直到阻塞結束。
4、訊號傳遞的兩個階段
訊號產生:核心更新目標程序的資料結構,表示乙個新訊號已經被傳送;【已經產生還沒有傳遞的訊號:掛起訊號】
訊號傳遞:核心強迫程序對訊號做出反應,改變程序狀態或執行訊號處理程式。
5、訊號通常只能被current程序傳遞;選擇性阻塞;程序響應乙個訊號處理程式時,通常遮蔽相信的訊號,訊號傳遞函式不必可重入。
6、核心必須實現: (1)記住那些程序被阻塞;(2)從核心態切換到使用者態時,對任何乙個程序都要檢查是否有訊號到達;(3)確定是否可以忽略;(4)處理訊號(註冊訊號處理程式)
7、posix訊號和多執行緒應用:
訊號處理程式必須在多執行緒應用之間共享;每個執行緒有自己的阻塞掩碼,掛起訊號掩碼。
庫函式kill和sigqueue必須向多執行緒應用而不是某個特殊的執行緒傳送訊號。
每個傳送給多執行緒應用的訊號僅僅傳遞給乙個執行緒,這個執行緒是由核心在從不阻塞該訊號的執行緒中選擇出來的。
如果向多執行緒傳送乙個致命訊號,該訊號將殺死所有的執行緒,而不只是接受訊號的執行緒。
8、訊號描述符:用來跟蹤共享掛起的訊號,訊號描述符被統一執行緒組共享(所有執行緒的程序描述符中的signal都指向該結構體)。
9、訊號處理程式描述符:也是共享的(同上)
10、掛起訊號佇列
共享掛起訊號佇列:位於訊號描述符的shared_pending欄位,存放整個執行緒組的掛起訊號
私有掛起訊號佇列:位於程序描述符的pending欄位,存放特定程序的訊號
11、產生訊號:訊號可能來自核心和另乙個程序,可以傳送給乙個程序或一組程序
某個核心函式呼叫產生訊號的核心函式,修改某個程序的描述符。目標程序根據訊號的型別,程序的狀態喚醒一些程序,促使這些程序接受訊號。
12、傳遞訊號:核心每次從核心態返回使用者態,檢查tif_sigpending標誌,如果有非阻塞的掛起訊號,就需要處理。
13、與訊號處理相關的系統呼叫
kill(pid_t pid,sigset_t sig);/*向執行緒組傳送乙個訊號*/
tkill(pid_t pid,sigset_t sig);/*向執行緒組中的指定程序傳送訊號*/
tgkill(pid_t pid,sigset_t sig,tgid tgid);/*向特定執行緒組的某個程序傳送乙個訊號*/
/*改變訊號的操作*/
int sigaction( int signo, const struct sigaction *restrict act, struct sigaction *restrict oact);
/*檢查掛起的阻塞訊號*/
int sigpending(sigset_t *set);
/*修改阻塞訊號的集合*/
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
/*掛起程序,在乙個原子操作中先恢復訊號遮蔽字,然後使程序休眠*/
int sigsuspend( const sigset_t *sigmask );
Linux作業系統 訊號通訊
實驗前置知識 訊號處理函式 1 訊號安裝函式 signal 函式示例 include signal.h 使用兩個函式都必須包含這個標頭檔案 include unistd.h include stdio.h 訊號處理函式,呼叫時引數dunno會得到訊號的值 void sigroutine int du...
作業系統訊號
在 posix 相容的平台上,sigkill 是傳送給乙個 程序來導致它立即終止的訊號。sigkill 的符號常量 在標頭檔案 signal.h 中定義。因為在不同平台上,訊號數字可能變化,因此符號訊號名被使用,然而在大量主要的系統上,sigkill 是訊號 9。當sigkill 被傳送給乙個程式時...
作業系統 訊號(2)
作業系統中,訊號的產生可以告訴系統要去執行某個操作。作業系統中有預設的訊號處理函式。我們也可以更改預設的訊號處理函式,由我們自己寫。訊號捕捉 我們先來看看訊號在核心中是怎樣的 訊號對於作業系統來說,分為3類 1.阻塞訊號 2.未決訊號 3.忽略 每個訊號都有兩個標誌位分別為阻塞 block 和未決 ...