Linux學習系列 訊號

2021-07-11 08:09:19 字數 938 閱讀 5325

訊號是軟體中斷,提供了典型的非同步機制。每個訊號有乙個編號,訊號分為兩類:非實時訊號和實時訊號。0-31編號屬於非實時訊號;31-63編號屬於實時訊號。為什麼會分為這兩類訊號呢?這個主要是因為歷史原因,首先實現的是非實時訊號,非實時訊號也成為不可靠訊號,是因為其實現機制導致這類訊號可能會丟失;而實時訊號,由於存在排隊機制,所以不會丟失。關於這點會在訊號的處理過程圖示中詳細闡述。

每個訊號都可以被關聯1個訊號處理函式,如果沒有關聯,其處理動作是系統預設的,大部分都是動作都是忽略,具體每個訊號的預設處理動作可以谷歌查詢。在目標程序執行過程中,會檢測是否有訊號等待處理(每次從系統空間返回到使用者空間時都做這樣的檢查),如果有,則呼叫訊號處理函式。

實際執行訊號的處理動作稱為訊號遞達,訊號從產生到遞達之間的狀態成為未決。程序既可以忽略訊號,也可以阻塞訊號。阻塞的意思是訊號不會被遞達,而忽略是訊號遞達之後的乙個可選動作。訊號在核心中的表示包括兩個標記位:阻塞標記位和未決標記位以及訊號處理函式的指標。

如果存在未決訊號等待處理且該訊號沒有被程序阻塞,則在執行相應的訊號處理函式前,程序會把訊號在未決訊號鏈中占有的結構卸掉。是否將訊號從程序未決訊號集中刪除對於實時與非實時訊號是不同的。

對於非實時訊號來說,由於在未決訊號資訊鏈中最多隻占用乙個sigqueue結構,因此該結構被釋放後,應該把訊號在程序未決訊號集中刪除(訊號登出完畢)。

對於實時訊號來說,可能在未決訊號資訊鏈中占用多個sigqueue結構,因此應該針對占用sigqueue結構的數目區別對待:如果只占用乙個sigqueue結構(程序只收到該訊號一次),則應該把訊號在程序的未決訊號集中刪除(訊號登出完畢)。否則,不應該在程序的未決訊號集中刪除該訊號(訊號登出完畢)。

下圖就是我理解的訊號處理過程:

linux訊號學習

在linux中,訊號是程序間通訊的一種方式,它採用的是非同步機制。當訊號傳送到某個程序中時,作業系統會中斷該程序的正常流程,並進入相應的訊號處理函式執行操作,完成後再回到中斷的地方繼續執行。訊號處理函式的註冊,linux系統訊號機制最簡單的介面是signal函式 include void signa...

linux學習 訊號簡介

訊號 簡單理解為軟體中斷 訊號產生 1 按鍵產生訊號,例如ctrl c 2 硬體異常產生訊號,例如無效的記憶體引用 3 程序呼叫kill函式將訊號傳送給其他程序 4 使用者用kill命令將訊號傳送給程序 5 某種軟體條件發生,比如alarm函式設定的定時器已超時 訊號的處理 1 忽略此訊號,大多數訊...

linux學習筆記之訊號

訊號機制是程序之間想回傳遞訊息的一種方法,應用於非同步事件的處理,訊號全稱為軟中斷訊號,它被傳送給乙個正在被執行的程序以通知該程序有某一件事發生。發出訊號的原因有很多 1.與程序終止有關的訊號。當程序退出或子程序終止時,會發出這類訊號 2.與程序列外事件相關的訊號。如程序越界,或企圖寫乙個唯讀的記憶...