因為main函式和訊號處理函式中都呼叫getpwnam函式,而在getpwnam函式中會呼叫malloc和free,如果主函式malloc之後收到
sigalrm訊號進入訊號處理函式,在訊號處理函式裡malloc然後free,而在訊號處理函式呼叫free和main函式也在呼叫free時,malloc
和free維護的資料結構就出現了損壞。
所以在訊號處理函式中呼叫非可重入函式,則其結果是不可預知的。
#include "apue.h"
#include #include "error.h"
static void my_alarm(int signo)
alarm(1);
}int main(void)
if (strcmp(ptr->pw_name, "sebastien") != 0)
}}
訊號處理函式的注意事項 可重入函式
可重入和不可重入 怎麼會有可重入和不可重入。在多工系統下,中斷可能在任務執行的任何時間發生 如果乙個函式的執行期間被中斷後,到重新恢復到斷點進行執行的過程中,函式所依賴的環境沒有發生改變,那麼這個函式就是可重入的,否則就不可重入。在中斷前後不都要儲存和恢復上下文嗎,怎麼會出現函式所依賴的環境發生改變...
訊號之函式的可重入性
訊號之函式的可重入性 在呼叫某個函式過程 現中斷訊號,且改訊號處理函式中再次呼叫該函式,訪問全域性 靜態變數的函式是不可重入函式。前後資料不一致,函式是不可重入的,特點 函式中使用全域性變數或靜態變數。前後資料一致,函式是可重入的,特徵 函式中使用區域性變數。root spark cat reins...
Signal處理中的函式可重入問題
訊號是軟體層次上模擬的中斷,它是一種非同步通訊的處理機制。訊號的非同步性意味著,應用程式不用等待事件的發生,當訊號發生時應用程式自動陷入到對應的訊號處理函式中。產生訊號的事件對程序而言是隨機出現的。訊號的響應方式有忽略 捕捉 執行預設動作三種。執行緒安全函式 在c語言中區域性變數是在棧中分配的,任何...