LINUX 訊號之我見

2021-05-21 21:59:41 字數 1254 閱讀 7907

最近又重新回顧了一下關於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 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序接觸對此訊號的阻塞,才執行遞達的操作。阻塞和忽略不同,只有訊號阻塞就不會遞達,而忽略是在訊號遞達之後可選...