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

2021-07-15 23:29:06 字數 2867 閱讀 6681

函式kill和raise:

kill函式將訊號傳送給程序或程序組,raise函式則執行程序向自身傳送訊號。

kill的pid引數有以下四種不同情況:

pid>0,將該訊號傳送給程序id為pid的程序

pid==0,將該訊號傳送給與傳送程序屬於同一程序組的所有程序。

pid<0 ,將該訊號傳送給程序組id等於pid絕對值

pid==-1,將該訊號傳送給傳送程序有許可權傳送訊號的所有程序。

函式alarm和pause:

使用alarm函式可以設定乙個定時器,在某個時刻定時器超市,產生sigalrm訊號,若忽略或不捕捉此訊號,則預設動作是終止呼叫該alarm函式的程序。

雖然sigalrm的預設動作是終止程序,但大多數使用鬧鐘的程序捕捉此訊號。

pause函式:使呼叫程序掛起直到捕捉到乙個訊號。

#include

int pause(void);

只有執行了乙個訊號處理程式並從其返回時,pause才返回。

利用alarm和pause函式可使自己休眠一段時間。

#include #include static void sig_alrm(int signo)

unsigned int sleep1(unsigned int seconds)

這個是sleep簡單而不完整的實現,有幾個問題,在第一次呼叫alarm和pause有乙個競爭條件,可能alarm在呼叫pause之前就超時,並呼叫了訊號處理程式sig_alrm,這種情況下,呼叫pause後,如果沒有捕捉到其他訊號,呼叫者將永遠被掛起。

除了用來實現sleep函式外,alarm還常用於對可能阻塞的操作設定時間上限值,例如,程式中有乙個讀低速裝置的可能阻塞的操作,我們希望超過一定時間就停止執行該操作。

訊號集:需要乙個能夠表示多個訊號的資料類,將在sigprocmask類函式中使用這種資料型別,以便告訴核心不允許發生該訊號集中的訊號,

函式sigemptyset初始化由set指向的訊號集,清除其中所有訊號,函式sigfillset初始化由set指向的訊號集,使其包括所有訊號,所有應用程式在使用訊號集前,要對該訊號集呼叫sigemptyset或sigfillset一次,因為c編譯程式將不賦予初值的外部變數和靜態變數都初始化為0,。

一旦初始化了乙個訊號集,以後就可在訊號集中增、刪特定的訊號。sigiaddset將乙個訊號新增到已有的訊號集,sigdelset刪除乙個訊號。

如果實現的訊號數目少於乙個整型量所包含的位數,可用一位代表乙個訊號的方法實現訊號集。sigemptyset函式將整型設定為0,sigfillset函式將整型設定為1,sigaddset開啟一位就是將該位設定為1,sigdelset關閉一位將該位設定為0。sigismember測試乙個指定的位,因為沒i有訊號編號為0,從訊號編號減一得到要處理位的位編號。

引數signo是訊號編號,若act指標非空,則要修改其動作,若oact指標非空,則系統經過oact指標返回該訊號的上乙個動作。此函式使用以下結構

函式sigsetjmp和siglongjmp

之前用於非區域性轉移的setjmp和longjmp函式,在訊號處理函式中經常呼叫longjmp函式以返回到程式的主迴圈中,但是呼叫longjmp有個問題,當捕捉到乙個訊號時,進入訊號捕捉函式,此時當前訊號被自動加到程序的訊號遮蔽字中,這阻止了後來產生的這種訊號中斷該訊號處理程式。

函式abort:使程式異常終止

此函式將sigabrt訊號傳送給呼叫程序,在程序終止之前由其窒息感所需的清理操作,如果程序並不在訊號處理程式中終止自己,那麼當訊號處理程式返回時,abort終止該程序。

函式sleep:

此函式使呼叫程序被掛起,直到滿足下面兩個條件之一:

1.以及過了seconds所指定的牆上時鐘時間

2.呼叫程序捕捉到乙個訊號並從訊號處理程式返回。

儘管sleep函式可以用alarm函式實現,但這並不是必須的。使用alarm函式可鞥兩個函式之間還會互相影響。

nanosleep函式:與sleep函式類似,但提供了納秒級的精度。

作業控制訊號:

在那麼多訊號中,與作業控制有關的是6個:

sigchld 子程序已停止或終止

sigcont 如果程序已停止,則使其繼續執行

sigstop 停止訊號

sigtstp 互動式停止訊號

sigttin 後台程序組成員讀控制終端

sigttou 後台程序組成員寫控制終端

除了sigchld之外,大多數應用程式並不處理這些訊號,互動式shell則通常會處理這些訊號的所有工作,當鍵入掛起字元(crtl+z),sigtstp被送至前台程序組的所有程序,當我們通知在前台或後台恢復執行乙個作業時,shell向該作業的所有程序傳送sigcont訊號。

在作業控制訊號之間還存在某種互動,比如當乙個程序產生4種停止訊號(sigtstp、sigstop、sigttin或sigttou)中的任意一種時,對該程序的任一未決訊號sigcont訊號就被丟棄,與此類似,當對乙個程序產生sigcont訊號時,對同一程序的任一未決停止訊號被丟棄。

訊號名和編號:

訊號名和編號之間如何進行對映,系統提供陣列:

extern char  *sys_siglist;

陣列下標是訊號編號,陣列中的元素是指向訊號名符串的指標

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

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

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

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

《unix高階環境程式設計》訊號 訊號傳送與捕獲

kill 函式是將訊號傳送給程序或程序組,raise 函式是將訊號傳送給自身,他們定義及說明如下所示 cpp view plain copy 訊號傳送與捕獲 函式功能 將訊號傳送給程序或程序組 返回值 若成功則返回0,若出錯則返回 1 函式原型 include intkill pid t pid,i...