Linux 進程信號:信號的概念、生命週期、產生流程、阻塞


信號的概念

信號

信號是一個軟中斷。操作系統通過信號通知某個進程發生了某件事件,然後中斷這個進程當前操作,讓它優先去處理這個事件。

我們在linux下常用的kill命令就是通過向進程發送一個信號來使進程中斷,我們可以通過kill -l來查看信號的種類

信號的種類

在這裏插入圖片描述
可以看到32和33號信號是不存在的,並且1-31是有具體名稱的,而34號及之後的都是以SIGTMIN+數字命名。

信號種類:62種

不可靠信號:1-31號,從unix借鑑而來,每個都有對於的系統事件,不可靠是因爲可能會丟失信號導致事件丟失

可靠信號:34-64號,後期擴充的,因爲沒有具體對應的事件,所以命名比較草率,不會丟失信號。


信號的生命週期

生命週期:產生信號->在進程中註冊信號->在進程中註銷進行->處理信號

信號的產生:

  1. 通過終端按鍵產生信號
    例如常用的ctrl + z、ctrl + c、ctrl + \就是分別產生了SIGTSTP、SIGINT、SIGQUIT信號。
  2. 通過調用系統函數向進程發送信號
    例如kill -x函數,x就是對應的信號的序號,如果不知名則發送15號信號SIGTERM。kill殺死進程的原理就是通過發送一個信號,讓這個進程中斷並去處理這個信號,然而這個信號的處理結果就是讓這個進程退出。
    3.通過軟件異常產生信號
    例如上一篇說過管道如果讀端全部關閉,而寫端沒關閉時就會發送一個SIGPIPE的信號
    4.通過硬件異常產生信號
    例如當運算中以0爲除數,則CPU的運算單元會檢測到除0異常,併發送SIGFPE信號

信號的註冊

信號註冊的流程主要是修改pcb中的pending位圖並向pcb中的sigqueue鏈表中添加新的節點,但根據信號的種類不同操作也不同。

不可靠信號的註冊:
首先查看pending位圖該信號的標誌位是否爲0,如果爲0則將標誌位修改爲1,並向sigqueue鏈表添加新的節點。如果爲1則說明該信號已經註冊過,則忽略此次事件,什麼都不做,也正是因爲這樣會導致事件的丟失,才被稱爲不可靠信號。

可靠信號的註冊:
可靠信號註冊時則不管該信號是否註冊過,都會往sigqueue鏈表中添加新的節點並修改位圖,這樣就保證了每一個發送的事件都會被處理,這也是被稱爲可靠的原因。

信號的註銷

爲了保證每一種信號只被處理一次,所以需要先註銷再處理。
註銷就是消除這個信號存在的痕跡,即修改位圖,刪除sigqueue中的節點。

不可靠信號的註銷:
因爲不可靠信號只註冊了一次,只需要刪除sigqueue中的節點,然後所以將位圖對應的標誌位置零。

可靠信號的註銷:
因爲可靠信號註冊了多次,添加了多個節點,所以需要刪除該信號添加的所有相同節點,纔將位圖對應的標誌位置零。

信號的處理

因爲信號是操作系統發給進程來通知某個事件的到來,所以對信號的處理也就是對事件的處理。

信號的處理方式:
  1. 默認處理方式: 就是操作系統爲每一種信號準備的對應的處理方式

  2. 忽略處理方式: 和名字一樣,忽略,什麼都不做

  3. 自定義處理方式: 我們可以自己寫一個回調函數來替換原來的處理方法,完成我們想要對這個信號的處理方式。

在這裏插入圖片描述
信號的捕捉流程

  1. 在主函數時因爲異常或者中斷或者系統調用進入內核態。
  2. 處理完異常後開始處理信號
  3. 調用用戶自定義的回調函數,返回用戶態
  4. 回調函數執行完畢,通過系統調用sigreturn返回內核態
  5. 信號處理完畢,調用sys_sigreturn()返回到一開始主函數被中斷的地方,繼續執行下面的語句。

接口:

   sighandler_t signal(int signum, sighandler_t handler);
   信號
   
   typedef void (*sighandler_t)(int);
   //回調函數,這是一個函數指針,我們通過編寫自己的回調函數,然後signal通過函數指針來找到這個函數,替換到原來的操作

signum:信號的序號
handler:處理方式
頭文件:#include <signal.h>
返回值:返回一個函數指針,也就是第二個參數


信號的阻塞

信號的阻塞並不是不註冊一個信號,而是註冊後暫時先不對它進行處理,在block位圖中修改標誌位,將其阻塞,直到進程解除對該信號的阻塞的時候再處理這個信號

同時,有兩個信號比較特殊,9號信號SIGKILL和19號信號SIGSTOP這兩個信號不可被阻塞,不可被忽略,不可被自定義處理

接口:
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章