第二十三篇:訊號機制的兩個思考

穆晨發表於2017-01-28

前言

       前文介紹了最基本的訊號接收和處理,但這有無可能帶來一些問題呢?

       本文將通過兩個思考,來分析可能帶來的問題以及解決方法。

思考一:中斷的系統呼叫

       如果使用者正在執行系統呼叫,如 write read。如果這個時候程式跳轉到了訊號處理函式後返回,則是否重新執行這個系統呼叫

結論

       這要分情況討論:如果是磁碟 I/O 的系統呼叫,則自然需要自動重啟;而如果是終端 I/O,則不需要自動重啟。

       在訊號函式族中,有很多函式都是支援設定是否重啟選項的。當然,使用者也可以使用類似下面的程式碼自行實現重啟:

       

思考二:可重入函式

       有些函式需要使用系統資源,比如 malloc 需要使用記憶體資源,那麼當某個函式正在呼叫 malloc 的時候,如果系統進入了訊號處理函式,而在這個處理函式中,如果再呼叫了 malloc,是不是會破壞掉原來函式中的資料呢?

結論

       是的。因此,需要區分可重入函式和非可重入函式。下圖中出現的函式都是可重入函式,沒有在圖中出現的則是非可重入函式:

       

相關文章