1. 程式人生 > >Linux:訊號的底層實現機制

Linux:訊號的底層實現機制

1.訊號:系統先定義好的某些特定的事件,可以被髮生,也可以被接受。發生和接受的主體都是程序。


2.訊號機制:系統預先定義好的一些事件


3.程序對訊號的響應方式:當程序發生時,使用者可以要求程序以以下三種方式之一對訊號做出響應:


               a.預設訊號(SIG_DFL):按系統預設方式處理,大部分訊號的預設操作是終止操作,且所有的實時訊號的預設動作都是終止程序。
               b.忽略訊號(SIG_IGN):大多數訊號都可以使用這種方式進行處理,但是SIGKILL和SIGSTOP這兩個訊號不能被忽略,同時這兩個訊號也不能捕獲和阻塞。此外,如果會忽略某些由硬體異常產生的訊號(如非法儲存訪問或除以0),則程序的行為是不可預測的。
               c.自定義訊號:對於自定義的訊號,可以為其指定訊號處理函式,訊號發生時該函式自動被呼叫,在該函式內部實現對訊號的處理。


4.修改訊號的響應方式:修改PCB結構中,struct sigaction結構體陣列中對應訊號值作為下標的函式指標。

tepedef   void (*Fun)(int);

 Fun  signal( int   sigtype,Fun  fun);//sigtype 表示訊號的型別;fun 表示訊號值;
返回值:呼叫成功返回最後一次安裝訊號signum而呼叫signal()時的fun值。失敗則返回SIG_ERR.

5.訊號的傳送

                                   ....32個

思考:

     1.兩個程序同時給一個程序傳送相同訊號,結果是什麼?

     2.連續兩次給同一個程序傳送同一個訊號,結果是什麼?

注:

     1.如果連續收到n個相同訊號,並且訊號處理函式執行需要執行持續一段時間,接受訊號的程序會將所有的訊號合併成一個訊號;

     2.如果第一個訊號正在處理,則第二個訊號會等待第一個訊號處理完成;

     3.訊號處理分為兩部分:上半部分識別訊號    下半部分處理程序;

     4.訊號響應方式一旦修改,後續接收訊號一直沿用,知道程序終止或者再次修改。

6. 程序的替換:直接替換

7.庫函式