实现 Signal.trap 回调的注意事项

与在 C 或大多数其他语言中实现信号处理程序一样,传递给 Signal.trap 的所有代码都必须是可重入的。如果您不熟悉可重入性,您需要在 Wikipedia 或其他地方阅读有关它的内容,然后再阅读本文档的其余部分。

最重要的是,“线程安全性”不能保证可重入性;而 Mutex#lock 和 Mutex#synchronize 等通常用于线程安全性的方法甚至会阻止可重入性。

Ruby VM 的实现细节

Ruby VM 会延迟运行 Signal.trap 回调,直到其内部数据结构安全为止,但它不知道 YOUR 代码中的数据结构何时安全。Ruby 通过使用仅将 异步信号安全函数 注册为信号处理程序的短 C 函数来实现延迟信号处理。这些短 C 函数仅执行足够的操作,以告知 VM 稍后在 Ruby Thread 主线程中运行通过 Signal.trap 注册的回调。

Signal.trap 块中调用不安全的方法

如有疑问,请将下面未列为安全的方法视为不安全的方法。

Signal.trap 块中常见的安全操作

Signal.trap 内部的系统调用包装器方法是安全的

由于 Ruby 在许多 异步信号安全 C 函数 周围都有包装器,因此许多 IOFileDirSocket 方法的相应包装器是安全的。

(不完整列表)