【发布时间】:2014-04-04 02:02:15
【问题描述】:
我已经浏览了所有关于 Ruby C 扩展的文档,但没有找到好的结果。
对于在解释器退出时调用的初始化 C 扩展的 Init_... 方法是否有补充?
【问题讨论】:
-
文件是这个意思吗?ruby-doc.com/docs/ProgrammingRuby
标签: ruby ruby-c-extension
我已经浏览了所有关于 Ruby C 扩展的文档,但没有找到好的结果。
对于在解释器退出时调用的初始化 C 扩展的 Init_... 方法是否有补充?
【问题讨论】:
标签: ruby ruby-c-extension
Ruby 代码可以使用Kernel#at_exit。
at_exit { puts "This code runs when Ruby exits." }
eval_jump.c 中 Kernel#at_exit 的实现调用了一个 C 函数 rb_set_end_proc()。此函数是公共的,因此您可以从自己的 C 代码中调用它。 declaration 是
void rb_set_end_proc(void (*)(VALUE), VALUE);
第一个参数是指向 C 函数的指针(在 Ruby 退出时被调用)。第二个参数是传递给 C 函数的 Ruby 值。
【讨论】:
没有通用的“解释器退出”钩子。但是 Ruby 会在正常退出时对所有内容进行垃圾收集,包括 Module 和 Class 对象,并且有一种方法可以挂钩对象垃圾收集。因此,您可以修改以下代码,使其同样适用于 Ruby 解释对象或由 C 库定义的对象:
module MyLib
end
ObjectSpace.define_finalizer( MyLib, proc { puts "MyLib unloaded" } )
您需要注意避免在运行此代码时假设您期望可用的其他模块或类对象仍然存在,您无法完全控制程序退出时调用它的顺序。
【讨论】: