首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux C編程:信號處理的潛在危險與防範措施

     編輯:關於C語言

信號處理的三大風險場景

1. 系統調用被中斷(EINTR)

註冊信號處理函數後,某些本應不受影響的系統調用(如 read、wait)可能被信號中斷,返回 -1 並設 errno = EINTR。若程式未檢查此錯誤碼,可能誤以為調用失敗導致邏輯錯誤或資料遺失。

對策:使用 sigaction 設置 SA_RESTART 標誌,讓系統自動重啟被中斷的調用。

2. 信號處理函數重入問題

執行信號處理函數時若又有信號到達,可能導致第一個處理被中斷,轉而執行第二個。若處理函數使用靜態/全域變量,會造成資料競爭與邏輯錯亂。

對策:sigaction 設置 SA_NODEFER 阻塞同類信號,或在處理函數中避免使用非可重入函數與共享資料。

3. 繁忙系統下的 alarm+pause 競態

調用 alarm 後緊接 pause,若系統極度繁忙導致 pause 尚未執行時鬧鐘已觸發,進程將永久掛起。

對策:改用 select、poll 或 nanosleep 實現超時等待,避免依賴信號同步。

最佳實踐總結

  • 優先使用 sigaction 而非 signal,明確指定 SA_RESTART、SA_NODEFER、SA_SIGINFO 等標誌。
  • 信號處理函數內只做極簡單操作(如修改 volatile sig_atomic_t 標誌),複雜邏輯放主迴圈。
  • 避免在處理函數中調用非異步安全函數(printf、malloc、lock 等)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved