Linux Signal 呼叫時,系統的處理

2021-06-05 23:04:17 字數 952 閱讀 3104

最近同事的程式設計過程中用到了linux的signal機制,從而引發了我對linux中signal機制的思考。signal機制在linux中是乙個非常常用的程序間通訊機制,很多人在使用的時候不會考慮該機制是具體如何實現的。signal機制可以被理解成程序的軟中斷,因此,在實時性方面還是相對比較高的。linux中signal機制的模型可以採用下圖進行描述。

每個程序都會採用乙個程序控制塊對其進行描述,程序控制塊中設計了乙個signal的點陣圖資訊,其中的每位與具體的signal相對應,這與中斷機制是保持一致的。當系統中乙個程序a通過signal系統呼叫向程序b傳送signal時,設定程序b的對應signal點陣圖,類似於觸發了signal對應中斷。傳送signal只是「中斷」觸發的乙個過程,具體執行會在兩個階段發生:

1、  system call返回。程序b由於呼叫了system call後,從核心返回使用者態時需要檢查他擁有的signal點陣圖資訊表,此時是乙個執行點。

2、  中斷返回。程序被系統中斷打斷之後,系統將cpu交給程序時,需要檢查即將執行程序所擁有的signal點陣圖資訊表,此時也是乙個執行點。

綜上所述,signal的執行點可以理解成從核心態返回使用者態時,在返回時,如果發現待執行程序存在被觸發的signal,那麼在離開核心態之後(也就是將cpu切換到使用者模式),執行使用者程序為該signal繫結的signal處理函式,從這一點上看,signal處理函式是在使用者程序上下文中執行的。當執行完signal處理函式之後,再返回到使用者程序被中斷或者system call(軟中斷或者指令陷阱)打斷的地方。

signal機制實現的比較靈活,使用者程序由於中斷或者system call陷入核心之後,將斷點資訊都儲存到了堆疊中,在核心返回使用者態時,如果存在被觸發的signal,那麼直接將待執行的signal處理函式push到堆疊中,在cpu切換到使用者模式之後,直接pop堆疊就可以執行signal處理函式並且返回到使用者程序了。signal處理函式應用了程序上下文,並且應用實際的中斷模擬了程序的軟中斷過程。

OnNewIntent呼叫時機

說到onnewintent就牽涉到activity的啟動模式launchmode 分別是 standard singletop singletask singleinstance 1.standard 預設啟動模式,每次啟用activity時都會建立activity,並放入任務棧中,永遠不會呼叫on...

MFC OnSize事件呼叫時間

在ocx控制項被載入時,第一次呼叫onsize事件實在控制項中的各個部件未載入前,此時如果操作控制項中的控制項會出現控制針異常,需要提前判斷。ctestdlg m dlg int ctestctrl oncreate lpcreatestruct lpcreatestruct bool ctestd...

函式呼叫時的開銷

問題引入 在學習c語言時,老師強調過呼叫函式時會有開銷,但是函式呼叫的開銷體現在哪幾個方面並不十分清楚!舉例說明 寫乙個兩數求和的 此 中不呼叫函式 include int main 該程式對應的反彙編如下 include int main 00ba1419 pop edi 00ba141a pop...