第六十四章、信號的註冊調用

前幾章我們簡單瞭解了信號,這一章我們來了解下信號的註冊調用。

我們如果想要進程捕獲某個信號,然後作出相應的處理,就需要註冊信號處理函數。當進程為某個信號註冊了信號處理程序後,發生該信號時,內核就會調用註冊的函數。

我們來看一個註冊信號處理函數的系統調用:

typedef void (*__sighandler_t) (int);

__sighandler_t signal (int __sig, __sighandler_t __handler)

我們先來看第一條語句,這條語句我們先蓋住 typedef不看 ,sighandler_t就是一個函數指針,指向的函數接受一個整型參數並返回一個無類型指針 。加上typedef之後sighandler_t就是一種新的類型,就可以像int一樣地去用它,不同的是它聲明是一種函數指針,這種指針指向的函數接受一個整型參數並返回一個無類型指針 ;

我們瞭解了上面這條語句,那麼我們在來看下面這條語句,sig表示所註冊函數針對的信號,handler就是一個函數指針,它指定收到信號後進程所應採取的行動,這便是信號處理函數,這個信號處理函數可能是用戶自定義的一個函數,或是下面的兩個值:SIG_IGN和SIG_DFL。SIG_IGN表示忽略sig所指出的信號,SIG_DFL表示調用系統定義的默認處理,信號處理函數的參數是要處理的信號的信號值。

當程序執行signal後,表示自此參數1的信號將受到參數2的函數的管制。

注意:並非是程序執行到signal這一行就立即會對該信號做什麼操作,因為信號的產生是無法預期的,程序設計人員根本沒法預知該在哪一行捕捉突如其來的信號。用singnal設置信號處理函數只是告訴系統對這個信號用什麼程序來處理。

我們來看一個簡單的例子:

第六十四章、信號的註冊調用

這個程序很簡單,作用時讀入字符,並將其中的小寫字母轉換成大寫字母,在這個程序中註冊了針對信號SIGTERM的處理函數,在運行這個程序時,當在終端中用kill終止這個進程時,向程序發送一個SIGTERM信號,則轉向信號處理函數的調用,輸出一條信息後結束。


分享到:


相關文章: