最近又重新回顧了一下關於unix/linux下的訊號的知識,打算把自己的理解記錄下來。
一、訊號的分類。
1、不可靠和可靠。不可靠指的是訊號值為0-31的訊號;可靠訊號指的值是32-63的訊號。
不可靠訊號導致的問題:
(1)、訊號丟失。典型的情境是:如果此訊號在未決佇列裡或者是在阻塞佇列裡,核心將不會重新傳送此訊號。
如:偽碼如下
第一步:signal(signo,&handler_fun);
第二步:發生第1次signo
第三步:
handler_fun()
//假如在此又傳送了一次signo(第2次signo)那麼這次訊號將不會被註冊,所以handler_fun不會呼叫。
signal(signo,&handler_fun);
do sometings;
二、對程序產生訊號。
1、軟中斷、程式錯誤、kill函式、alarm函式等。
三、與程序對訊號的處理。
1、程序啟動後,對此程序產生的訊號(所有訊號)都是預設的操作(忽略、或者終止)。
2、在程序啟動後,如果對某個訊號,使用者想在收到此訊號時,改變對此訊號的處理行為,可以使用signal或者signation定義對此訊號的行為:預設(忽略或者終止)、忽略或者自定義函式處理。
3、sigprocmask的作用:告訴核心不要傳送在sigset結構體裡的訊號。當訊號產生是,核心首先檢視sigset裡是否存在此訊號,如果存在,那麼將阻塞此訊號,不傳送給程序。
如果使用者刪除了sigset裡的此個訊號,那麼核心將把阻塞的訊號傳送給程序。
4、當訊號傳送給了程序:
(1)此訊號將先在程序的訊號佇列裡排隊
(2)此訊號的狀態是:未決狀態(pending);如果是使用sigprocmask定義了阻塞,將是阻塞。
(3)如果使用者定義了(使用signal或者signation)此型別訊號的處理行為,那麼將按此行為處理,否則使用預設方式處理。
小結:訊號的生命週期:
產生階段----->註冊到使用者程序裡(可靠訊號每次都註冊,不可靠訊號如果在註冊裡存在將不再註冊)(未決或者阻塞)----->登出未決的訊號------>處理訊號行為(可以使用signal或signation定義行為)
參考http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
linux訊號 阻塞訊號
1.訊號在核心中的表示 我們知道了訊號產生的各種原因,而實際執行訊號處理的動作,叫做訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻...
Linux程序訊號 訊號處理
一 訊號相關概念 1.實際執行訊號的處理動作稱為訊號遞達 delivery 2.訊號從產生到遞達之間的狀態稱為訊號未決 pending 不一定會立即delivery 3.程序可以選擇阻塞 block 某個訊號。不會遞達 4.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...
Linux入門 訊號(二) 阻塞訊號
實際執行訊號的處理動作稱為訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序接觸對此訊號的阻塞,才執行遞達的操作。阻塞和忽略不同,只有訊號阻塞就不會遞達,而忽略是在訊號遞達之後可選...