當我們在使用malloc函式的時候,如果有訊號中斷了我們malloc操作,假設malloc剛剛從堆上的空閒鏈上找到合適的位置,結果打斷後去執行其他操作,剛好其他操作裡也有malloc,也恰好找到了剛剛malloc的地方,把那個空間從空閒空間鏈上取下,然後其他操作結束,返回。此時主函式內的那個malloc就取到了乙個非法位址。可見,某一些操作不可以被隨意中斷。所謂不可重入函式就是說,在函式執行時,被打斷了,那麼如果這個函式是不可重入的,這個函式就將從頭重新執行。
函式內使用了以下內容就是不可重入函式:
1.靜態變數。
2.malloc家族函式,free函式。
3.標準i/o。
在函式執行時,被打斷了,恢復後還是從打斷的位置繼續執行。類似巢狀執行。
以下都是可以在重入函式裡使用的函式
Linux 可重入函式與不可重入函式
函式是一段載入到記憶體的 函式的 可長可短,執行時間長度也不確定。在多執行緒中,執行緒之間是可以進行切換的。函式是一段寫好的 屬於程式公有的 段。乙個程序中有多個執行緒,每乙個執行緒都可以呼叫這段函式 執行。而在多執行緒環境中,執行緒的切換是無法預料的,你不知道下一秒是哪個執行緒在執行,每時每刻的執...
可重入 不可重入
在任務執行期間捕捉到訊號並對其進行處理時,程序正在執行的指令序列就被訊號處理程式臨時中斷。如果從訊號處理程式返回,則繼續執行程序斷點處的正常指令序列,從重新恢復到斷點重新執行的過程中,函式所依賴的環境沒有發生改變,就說這個函式是可重入的,反之就是不可重入的。眾所周知,在程序中斷期間,系統會儲存和恢復...
可重入和不可重入函式
把乙個不可重入函式變成可重入的唯一方法是用可重入規則來重寫它。其實很簡單,只要遵守了幾條很容易理解的規則,那麼寫出來的函式就是可重入的。1 不要使用全域性變數。因為別的 很可能覆蓋這些變數值。2 在和硬體發生互動的時候,切記執行類似disinterrupt 之類的操作,就是關閉硬體中斷。完成互動記得...