【Linux】信號的捕捉(捕捉過程及捕捉函數)

信號的捕捉過程

我們現在知道了信號在產生之後不是被立即處理的,而是在合適的時候才進行處理,那麼什麼時候是合適的時候呢?信號又是怎麼被捕捉的呢?

合適的時候是指:從內核態切換爲用戶態時進行信號的捕捉。

在Linux下,作爲普通用戶的我們會發現我們有時候會有一些文件不能進入、有一些文件不能創建、有一些信息不能看、我們創建的進程總數總是有上限的,我們訪問不了硬件層面的 東西,感覺自己被限制了,其實這就是一種權限。

內核態和用戶態都是一種狀態,這兩種狀態表示了兩種身份,這兩種身份表示了不同的權限等級,我們在訪問0-3G的地址空間時,我們用的是用戶權限,而我們通過系統調用接口以及我們想要訪問地址空間裏的3-4G空間時,我們就需要把自己的身份從內核態轉換爲用戶態。因此,內核態和用戶態最大的區別就是權限,內核態允許訪問3-4G的空間

從用戶態到內核態的過程是權限升級的過程,而從內核態到用戶態的過程是要從安全方面考慮的,因爲操作系統不相信任何人,只相信它自己,所以要想要訪問操作系統內部進行訪問時必須通過系統調用接口。操作系統的代碼只能由操作系統執行,用戶的代碼就只能由用戶執行,因此就會有內核態和用戶態兩種狀態之間的相互轉變。

如果信號的處理動作是用戶自定義函數,在信號遞達時就調用這個函數,這稱爲捕捉信號。由於信號處理函數的代碼
是在用戶空間的,處理過程比較複雜,舉例如下: 用戶程序註冊了SIGQUIT信號的處理函數sighandler。 當前正在執行
main函數,這時發生中斷或異常切換到內核態。 在中斷處理完畢後要返回用戶態的main函數之前檢查到有信號
SIGQUIT遞達。 內核決定返回用戶態後不是恢復main函數的上下文繼續執行,而是執行sighandler函 數,sighandler
和main函數使用不同的堆棧空間,它們之間不存在調用和被調用的關係,是 兩個獨立的控制流程。 sighandler函數返
回後自動執行特殊的系統調用sigreturn再次進入內核態。 如果沒有新的信號要遞達,這次再返回用戶態就是恢復
main函數的上下文繼續執行了。如下圖:

信號捕捉函數

1.signal

#include <signal.h>
sighandler_t signal(int signum, sighandler_t handler);

捕捉2號信號 

2.sigaction

#include <signal.h>
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);

捕捉2號信號 

 

 

 

 

 

 

 

 

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