我們都說訊號的產生之後不是被立即處理的,而是在合適的時候,那麼合適的時候是什麼時候呢?訊號又是怎麼**捉的呢?
合適的時候是指:從核心態切換為使用者態時進行訊號的捕捉
在linux下,我們會發現我們有時候會有一些檔案不能進入,有一些檔案不能建立,其實這就是一種許可權。核心態和使用者態都是一種狀態,這兩種狀態表示了兩種身份,這兩種身份表示了不同的許可權等級,我們在訪問0-3g的位址空間時,我們用的是使用者許可權,而我們通過系統呼叫介面以及我們想要訪問位址空間裡的3-4g空間時,我們就需要把自己的身份從核心態轉換為使用者態。因此,核心態和使用者態最大的區別就是許可權,核心態允許訪問3-4g的空間。
比如某個程序想要訪問3-4g記憶體,作業系統就會把這個程序劫持了,你必須要拿我(作業系統)的身份來訪問,這3-4g的空間是這個程序的,但是又用這個程序訪問了作業系統的資源,而且還要受作業系統的管控。
從使用者態到核心態的過程是許可權公升級的過程,而從核心態到使用者態的過程是要從安全方面考慮的,因為作業系統不相信任何人,只相信它自己,所以要想要訪問作業系統內部進行訪問時必須通過系統呼叫介面。作業系統的**只能由作業系統執行,使用者的**就只能由使用者執行,因此就會有核心態和使用者態兩種狀態之間的相互轉變。
假如我們現在在執行乙個程式,在執行過程中突然碰到系統呼叫介面了,此時就從使用者態陷入核心態了,在核心當中我就要開始執行這段**了,那麼現在我執行完了這段**了,我要準備返回主控制流程了,在這個時候,我檢查一下有沒有需要被遞達的訊號,忽略和預設這兩種處理動作非常簡單,處理之後直接返回主控制流程了,但是自定義訊號處理動作就不一樣了,如果我此時檢測到有訊號需要被處理,而且還是使用者自定義的處理動作,那麼此時我就會從核心態返回使用者態,然後去執行自定義的處理動作,我執行完了這段自定義處理動作的**之後,就又從使用者態陷入核心態了,此時再通過特殊的系統呼叫介面sigreturn返回使用者態,回到主控制流程剛剛被中斷的地方繼續向下執行,這個階段就是訊號的捕捉過程。
通過我畫的這幅圖深刻理解訊號捕捉的過程:
;函式的使用(捕捉2號訊號)
;函式的使用(捕捉2號訊號)
Linux訊號捕捉及其處理
一 signal訊號處理機制 可以用函式signal註冊乙個訊號捕捉函式,其函式原型為 include typedef void sighandler t int sighandler t signal int signum,sighandler t handler 下面用乙個例子來介紹signal...
Linux下的訊號以及訊號的處理
阻塞訊號 訊號捕捉 訊號處理 根據生活中的經驗,訊號就是向乙個事物傳遞某些資訊,在shell下啟動乙個前台程序,使用者輸入ctrl c,這個過程就相當於是再給核心傳遞乙個程序取消的訊號。那麼使用者按下ctrl c後,發生了什麼?在鍵盤上按下ctrl c等來產生訊號 include intkill p...
linux下採用trap對訊號進行捕捉
在linux中,trap命令主要用於接收訊號並採取行動,訊號是非同步傳送到乙個程式的事件,在預設情況下,可以終止乙個程式,trap命令原型如下 trap command signal signal是指接收到的訊號,command是接收到該訊號採取的行動。如下為兩種簡單的訊號。訊號 說明 int 2 ...