linux 訊號機制

2021-09-02 10:44:13 字數 1706 閱讀 5360

本文旨在弄懂linux中的訊號工作原理

kill -l 命令可以檢視linux下所有訊號

2.1 使用者在終端按下某些鍵時,終端驅動程式會傳送訊號給前台程序

例如ctrl-c產生sigint訊號,ctrl-\產生sigquit訊號,ctrl-z產生sigtstp訊號

2.2 硬體異常產生訊號,這些條件由硬體檢測到並通知核心,然後核心向當前程序傳送適當的訊號

例如當前程序執行了除以0的指令,cpu的運算單元會產生異常,核心將這個異常解釋為sigfpe訊號傳送給程序。再比如當前程序訪問了非法記憶體位址,,mmu會產生異常,核心將這個異常解釋為sigsegv訊號傳送給程序

2.3 乙個程序呼叫kill(2)函式可以傳送訊號給另乙個程序

2.4 可以用kill(1)命令傳送訊號給某個程序,kill(1)命令也是呼叫kill(2)函式實現的,如果不明確指定訊號則傳送sigterm訊號,該訊號的預設處理動作是終止程序

2.5 當核心檢測到某種軟體條件發生時也可以通過訊號通知程序,例如鬧鐘超時產生sigalrm訊號,向讀端已關閉的管道寫資料時產生sigpipe訊號

關於呼叫函式向程序傳送訊號

#include int kill(pid_t pid, int signo);

int raise(int signo);

上面的兩個函式,我們來解釋一下, 

kill函式兩個引數,pid為給哪個程序要發訊號,signo為哪中訊號。 

raise函式其實是kill函式的封裝,raise函式是自己給自己傳送任意訊號。 

上面兩個函式都是成功返回1,失敗返回0

訊號產生時,核心在該程序控制塊pcb中設定該訊號的未決標誌,直到訊號遞達才清除該標誌。 訊號在核心中的示意圖 

訊號遞達(delivery):實際執行訊號的處理動作

訊號未決(pending):訊號從產生到遞達之間的狀態

訊號阻塞(block):產生訊號,訊號也不會被遞達。被阻塞的訊號產生時將保持在未決狀態,訊號被阻塞了就不被遞達。 

未決和阻塞標誌可以用相同的資料型別sigset_t儲存,sigset_t稱為訊號集

程序可以選擇阻塞某個訊號 如果在訊號未決後,我們設定了阻塞,那麼該訊號會在未決表中等待解除阻塞 在訊號中我們要明白,訊號的阻塞和忽略不同,忽略是訊號的處理方式,而阻塞只是訊號在傳遞過程中,對訊號的一種延後處理的行為。

訊號未阻塞也未產生,當它遞達時執行預設處理動作

訊號產生但被阻塞,所以暫時不能遞達。儘管處理動作是忽略,但是在解除阻塞之前還不能忽略該訊號,因為程序仍有機會改變對訊號的處理動作之後再解除阻塞

忽略:忽略此訊號。

預設:執行該訊號的預設處理動作 自定義捕捉。

捕捉:提供乙個訊號處理函式,要求核心在處理訊號時切換到使用者態執行這個處理函式。

1 2 

Linux 信 號 機 制

前面介紹了訊號的基本概念,在這一節中,我們將介紹核心如何實現訊號機制。即核心如何向乙個程序傳送訊號 程序如何接收乙個訊號 程序怎樣控制自己對訊號的反應 核心在什麼時機處理和怎樣處理程序收到的訊號。還要介紹一下setjmp和longjmp在訊號中起到的作用。1 核心對訊號的基本處理方法 核心給乙個程序...

LINUX訊號機制

在電腦科學中,訊號是unix 類unix以及其他posix相容的作業系統中程序間通訊的一種有限制的方式。它是一種非同步的通知機制,用來提醒程序乙個事件已經發生。當乙個訊號傳送給乙個程序,作業系統中斷了程序正常的控制流程,此時,任何非原子操作都將被中斷。如果程序定義了訊號的處理函式,那麼它將被執行,否...

Linux 訊號機制 (二)

推薦一篇好文章 文章二 程序即將從核心態返回使用者態的時候,才會處理訊號 執行訊號處理函式 使用者程序什麼時候從核心態返回使用者態呢?系統呼叫 使用者主動進入核心 中斷 使用者程序被動進入核心 被排程執行 使用者從等待執行,變為正在執行 訊號處理函式時使用者態函式,但是需要在核心態的條件下執行。所以...