實作 Signal.trap 回呼的注意事項

與在 C 或大多數其他語言中實作訊號處理常式一樣,傳遞給 Signal.trap 的所有程式碼都必須是可重入的。如果您不熟悉可重入性,您需要在閱讀本文檔的其餘部分之前在 Wikipedia 或其他地方閱讀有關它的內容。

最重要的是,“執行緒安全性”不能保證可重入性;而通常用於執行緒安全性的方法,例如 Mutex#lock 和 Mutex#synchronize,甚至會阻止可重入性。

Ruby VM 實作的細節

Ruby VM 會延後執行 Signal.trap 回呼,直到其內部資料結構安全為止,但它不知道您的程式碼中資料結構何時安全。Ruby 透過註冊僅使用 非同步訊號安全函式 的簡短 C 函式,來實作延後訊號處理,作為訊號處理常式。這些簡短的 C 函式只會執行足夠的動作,告訴 VM 在 Ruby Thread 主程式稍後執行透過 Signal.trap 註冊的回呼。

Signal.trap 區塊中呼叫不安全的函式

有疑問時,請將以下未列為安全的任何內容視為不安全。

Signal.trap 區塊內常見的安全操作

Signal.trap 內部安全的系統呼叫包裝器方法

由於 Ruby 在許多 非同步信號安全 C 函式 周圍有包裝器,因此許多 IOFileDirSocket 方法的對應包裝器是安全的。

(不完整的清單)