前言
前文介紹了最基本的訊號接收和處理,但這有無可能帶來一些問題呢?
本文將通過兩個思考,來分析可能帶來的問題以及解決方法。
思考一:中斷的系統呼叫
如果使用者正在執行系統呼叫,如 write read。如果這個時候程式跳轉到了訊號處理函式後返回,則是否重新執行這個系統呼叫?
結論
這要分情況討論:如果是磁碟 I/O 的系統呼叫,則自然需要自動重啟;而如果是終端 I/O,則不需要自動重啟。
在訊號函式族中,有很多函式都是支援設定是否重啟選項的。當然,使用者也可以使用類似下面的程式碼自行實現重啟:
思考二:可重入函式
有些函式需要使用系統資源,比如 malloc 需要使用記憶體資源,那麼當某個函式正在呼叫 malloc 的時候,如果系統進入了訊號處理函式,而在這個處理函式中,如果再呼叫了 malloc,是不是會破壞掉原來函式中的資料呢?
結論
是的。因此,需要區分可重入函式和非可重入函式。下圖中出現的函式都是可重入函式,沒有在圖中出現的則是非可重入函式: