Linux系統程式設計(四)訊號

2021-10-19 18:30:03 字數 2059 閱讀 9363

二、常見訊號

三、訊號處理方式

四、訊號處理過程

五、未決訊號和阻塞訊號

六、訊號集操作函式

訊號在linux中又稱為軟中斷訊號,用來通知程序發生了非同步事件。程序收到訊號必須停止,直到處理完訊號後再執行下一條指令。

終端按鍵產生訊號 ,如(ctrl + c ,ctrl + z ,ctrl+\)

硬體異常產生訊號, 如(除0操作,非法訪問記憶體(段錯誤),匯流排錯誤)

kill命令以及程序之間可以互相通過系統呼叫kill傳送軟中斷訊號

linux訊號的編號是從1-64,其中32和33空缺,沒有對應的訊號。通過kill -l 可檢視所有的訊號

其中- 1~31之間的訊號叫做非實時訊號, 不支援排隊, 訊號可能會丟失, 也叫做不可靠訊號。

- 34~64之間的訊號叫做實時訊號, 支援排隊, 訊號不會丟失, 也叫做可靠訊號。

可靠訊號註冊機制:

核心每收到乙個可靠訊號都會去註冊這個訊號,在訊號的未決訊號鏈中分配sigqueue結構,因此,不會存在訊號丟失的問題。

不可靠訊號的註冊機制:

而對於不可靠的訊號,如果核心已經註冊了這個訊號,那麼便不會再去註冊,對於程序來說,便不會知道本次訊號的發生。

1.預設動作,預設動作包括:

term:終止程序

ign: 忽略訊號 (預設即時對該種訊號忽略操作)

core:終止程序,生成core檔案。(查驗程序死亡原因, 用於gdb除錯)

stop:停止(暫停)程序

cont:繼續執行程序

2.忽略某個訊號,不做任何處理

3.捕捉訊號處理

訊號的「未決」是一種狀態,是訊號產生和遞送之間的一種狀態。訊號產生,未決訊號集中描述改訊號的位會立即變為1,訊號處於未決狀態。當訊號被處理,對應位會變為0;如果訊號被阻塞,那麼訊號的未決狀態將保持在1,訊號也就無法執行。

#include

sigset_t set; // typedef unsigned long sigset_t;

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set, int signum);

int sigdelset(sigset_t *set, int signum);

int sigismember(const sigset_t *set, int signum);

函式sigemptyset初始化set所指向的訊號集,使其中所有訊號的對應bit清零,表示該訊號集不包含任何有效訊號。函式sigfillset初始化set所指向的訊號集,使其中所有訊號的對應bit置位,表示該訊號集的有效訊號包括系統支援的所有訊號。注意,在使用sigset_t型別的變數之前,一定要呼叫sigemptyset或sigfillset做初始化,使訊號集處於確定的狀態。初始化sigset_t變數之後就可以在呼叫sigaddset和sigdelset在該訊號集中新增或刪除某種有效訊號。這四個函式都是成功返回0,出錯返回-1。sigismember是乙個布林函式,用於判斷乙個訊號集的有效訊號中是否包含某種訊號,若包含則返回1,不包含則返回0,出錯返回-1。

#include

#include

#include

#include

void

printped

(sigset_t* set)

else

}printf

("\n");

}int

main()

printped

(&set);}

return0;

}

Linux系統程式設計 訊號

0x00 訊號和中斷類似,中斷是硬體發出,而訊號由軟體發出。訊號常用於程序間通訊,乙個訊號常見的處理如下 1 設定對應訊號的訊號處理函式。2 當訊號來臨時,打斷正常執行的程式 本質上是在系統呼叫前檢查是否有訊號的到來 去執行訊號處理函式。3 訊號處理函式執行完,繼續執行原程式。0x01 我們先來看一...

Linux系統程式設計 訊號

基本概念 訊號的狀態 產生未決狀態 沒有被處理的 遞達 已經被處理的 訊號的優先順序比較高 程序收到訊號之後,暫停正在處理的工作 訊號集 kill 發射訊號給某個程序 raise 自己給自己發訊號 函式原型 int raise int sig abort 給自己傳送異常終止的訊號 alarm 設定定...

Linux系統程式設計 訊號

訊號的共性 1.簡單 2.不能攜帶大量資訊 3.滿足特定條件才能傳送 訊號的機制 1.訊號是軟體層面的中斷。一旦訊號產生,無論程式執行到什麼位置都必須結束 2.所有訊號的產生以及處理都是核心產生.訊號的產生 1.按鍵產生 程ctrl c ctrl v 2.系統呼叫產生 kill函式 3.定時器 al...