unix 環境高階程式設計 訊號三態

2021-06-22 14:49:17 字數 743 閱讀 2546

訊號的產生:

這個不用說吧。apue上面說了幾種訊號產生的原因。

訊號遞達:

訊號遞達指的是訊號處理函式被呼叫,進行訊號的處理.

訊號未決:

訊號在產生與遞達之間的狀態稱為訊號的未決。

我們知道在未設定訊號阻塞的情況下,當有訊號產生的時候會中斷當前**的執行,轉去執行相應的訊號處理函式,這時候就有可能出現訊號重入的問題.所以這個時候我們可以設定訊號的阻塞。訊號的阻塞不是指的訊號被忽略,而是指的訊號的在遞達之前,程序執行的當前**段不會被中斷。至於程序什麼時候接觸對訊號的阻塞,apue上面沒有提到。

apue上面提到:如果為程序產生乙個選擇為阻塞的訊號,而且對這個訊號的動作是系統預設的動作或者是使用者自定義訊號處理函式,則為該程序將此訊號保持為未決狀態,直到程序對此訊號解除了阻塞或者是該訊號的動作是忽略.這裡也就是說當訊號的處理動作是忽略的時候,是不會處於未決狀態的.訊號的處理方式是在遞達之前被決定的,而不是在訊號產生的時候決定的,也就是說我們可以在訊號處於阻塞未決的時候,改變訊號的處理函式.

unix利用訊號遮蔽字(signal mask)來設定訊號的阻塞位,由於不同的系統中訊號的數量是不一定相同的,用整型來表示訊號遮蔽字不一定夠用,從而就有了sigset_t 資料型別來表示訊號遮蔽字。sigset_t 的每一位表示乙個特定的訊號是否阻塞。

注意的是:unix在pcb中維持了兩個sigset_t 型別的變數,乙個用來設定訊號遮蔽字,乙個用來判定哪些訊號處於阻塞且為未決狀態.相應的函式是sigpromask與sigpending

unix環境高階程式設計 訊號(2)

函式kill和raise kill函式將訊號傳送給程序或程序組,raise函式則執行程序向自身傳送訊號。kill的pid引數有以下四種不同情況 pid 0,將該訊號傳送給程序id為pid的程序 pid 0,將該訊號傳送給與傳送程序屬於同一程序組的所有程序。pid 0 將該訊號傳送給程序組id等於pi...

Unix環境高階程式設計 九 訊號

訊號時軟中斷,很多比較重要的應用程式都需要處理訊號,訊號提供了一種處理非同步事件的方法。每個訊號都乙個名字,以sig開頭,在標頭檔案中定義訊號型別,都是正整數 訊號編號 產生訊號的條件 1 當使用者按某些終端鍵時,引發終端產生的訊號。2 硬體異常產生訊號。3 程序呼叫kill函式將訊號傳送給另外乙個...

訊號概念(UNIX環境高階程式設計筆記)

每個訊號都有乙個名字。這些名字都以3個字元sig開頭。不存在編號為0的訊號。以下條件都可以產生訊號 當使用者按下某些終端鍵時,引發終端產生的訊號。如sigint。硬體異常產生訊號 除數為0 無效的記憶體引用等。程序呼叫kill 2 函式可以將任意訊號傳送給另乙個程序或程序組。接收訊號程序和傳送訊號程...