訊號處理

僅使用 C 標準的保證的訊號處理程式的使用強加了在使用者定義的訊號處理程式中可以或不可以完成的各種限制。

  • 如果使用者定義的函式在處理 SIGSEGVSIGFPESIGILL 或任何其他實現定義的硬體中斷時返回,則 C 標準未定義該行為。這是因為 C 的介面不提供改變故障狀態的方法(例如,在通過 0 劃分之後),因此當返回程式時,處於與硬體中斷髮生之前完全相同的錯誤狀態。

  • 如果呼叫使用者定義的函式是呼叫 abortraise 的結果,則不允許訊號處理程式再次呼叫 raise

  • 訊號可以在任何操作的中間到達,因此通常不能保證操作的不可分割性,訊號處理也不能很好地與優化一起工作。因此,訊號處理程式中對資料的所有修改都必須是變數

    • 型別 sig_atomic_t(所有版本)或無鎖原子型別(自 C11,可選)
    • 這是 volatile 合格的。
  • C 標準庫中的其他函式通常不會遵守這些限制,因為它們可能會更改程式的全域性狀態中的變數。C 標準僅對 abort_Exit(自 C99),quick_exit(自 C11 以來),signal(對於相同的訊號編號)和一些原子操作(自 C11 以來)提供保證。

如果違反了上述任何規則,則 C 標準未定義行為。平臺可能具有特定擴充套件,但這些擴充套件通常不能在該平臺之外移植。

  • 通常,系統有自己的非同步訊號安全功能列表,即可以從訊號處理程式使用的 C 庫函式。例如,通常 printf 就是這些功能之一。

  • 特別是 C 標準沒有詳細說明與其執行緒介面(自 C11)或任何特定於平臺的執行緒庫(如 POSIX 執行緒)的互動。這些平臺必須自己指定這些執行緒庫與訊號的互動。