1. 程式人生 > >訊號處理函式編寫規則

訊號處理函式編寫規則

https://www.ibm.com/developerworks/cn/linux/l-cn-signalsec/

關於編寫安全的訊號處理函式主要有以下一些規則:

  • 訊號處理函式儘量只執行簡單的操作,譬如只是設定一個外部變數,其它複雜的操作留在訊號處理函式之外執行;
  • errno 是執行緒安全,即每個執行緒有自己的 errno,但不是非同步訊號安全。如果訊號處理函式比較複雜,且呼叫了可能會改變 errno 值的庫函式,必須考慮在訊號處理函式開始時儲存、結束的時候恢復被中斷執行緒的 errno 值;
  • 訊號處理函式只能呼叫可以重入的 C 庫函式;譬如不能呼叫 malloc(),free()
    以及標準 I/O 庫函式等;
  • 訊號處理函式如果需要訪問全域性變數,在定義此全域性變數時須將其宣告為 volatile,以避免編譯器不恰當的優化。

從整個 Linux 應用的角度出發,因為應用中使用了非同步訊號,程式中一些庫函式在呼叫時可能被非同步訊號中斷,此時必須根據errno 的值考慮這些庫函式呼叫被訊號中斷後的出錯恢復處理