訊號處理函式的注意事項 可重入函式

2021-10-05 18:37:27 字數 944 閱讀 1241

可重入和不可重入

怎麼會有可重入和不可重入。

在多工系統下,中斷可能在任務執行的任何時間發生;如果乙個函式的執行期間被中斷後,到重新恢復到斷點進行執行的過程中,函式所依賴的環境沒有發生改變,那麼這個函式就是可重入的,否則就不可重入。

在中斷前後不都要儲存和恢復上下文嗎,怎麼會出現函式所依賴的環境發生改變了呢?

我們知道中斷時確實儲存一些上下文,但是僅限於返回位址,cpu暫存器等之類的少量上下文,而函式內部使用的諸如全域性或靜態變數,buffer等並不在保護之列,所以如果這些值在函式被中斷期間發生了改變,那麼當函式回到斷點繼續執行時,其結果就不可預料了。

滿足下面條件之一的多數是不可重入函式:

(1)使用了靜態資料結構;

(2)呼叫了malloc或free;

(3)呼叫了標準i/o函式;

(4)進行了浮點運算.

malloc/free是不可重入的,它們使用了全域性變數來指向空閒區;

標準i/o庫的很多實現都使用了全域性資料結構;

許多的處理器/編譯器中,不可重入的 (浮點運算大多使用協處理器或者軟體模擬來實現)。

在訊號處理程式及多執行緒程式設計時,要特別注意。

考慮這種情況:

訊號處理程式a內外都呼叫了同乙個不可重入函式b;b在執行期間被訊號打斷,進入a (a中呼叫了b),完事之後返回b被中斷點繼續執行,這時b函式的環境可能改變,其結果就不可預料了。

多執行緒共享程序內部的資源,如果兩個執行緒a,b呼叫同乙個不可重入函式f,a執行緒進入f後,執行緒排程,切換到b,b也執行了f,那麼當再次切換到執行緒a時,其呼叫f的結果也是不可預料的。

在訊號處理程式中即使呼叫可重入函式也有問題要注意。作為乙個通用的規則,當在訊號處理程式中呼叫可重

入函式時,應當在其前儲存errno,並在其後恢復errno。(要了解經常**捉到的訊號是sigchld,其訊號處理程式通常要呼叫一種wait函式,而各種wait函式都能改變errno。)

訊號之函式的可重入性

訊號之函式的可重入性 在呼叫某個函式過程 現中斷訊號,且改訊號處理函式中再次呼叫該函式,訪問全域性 靜態變數的函式是不可重入函式。前後資料不一致,函式是不可重入的,特點 函式中使用全域性變數或靜態變數。前後資料一致,函式是可重入的,特徵 函式中使用區域性變數。root spark cat reins...

函式的注意事項

1 函式的形參列表可以是多個,返回值列表也可以是多個。2 形參列表和返回值列表的資料型別可以是值型別和引用型別 3 函式的命名遵循識別符號命名規範,首字母不能是數字,首字母大寫該函式可以被本報檔案和其它包檔案使用,類似public,首字母小寫,只能被本包使用,其它包檔案不能使用,類似private ...

在訊號處理函式中呼叫非可重入函式getpwnam

因為main函式和訊號處理函式中都呼叫getpwnam函式,而在getpwnam函式中會呼叫malloc和free,如果主函式malloc之後收到 sigalrm訊號進入訊號處理函式,在訊號處理函式裡malloc然後free,而在訊號處理函式呼叫free和main函式也在呼叫free時,malloc...