我已经阅读了所有关于Ruby C扩展的文档,我发现这些文档没有好结果。
是否有Init_...
初始化C扩展的方法的补充,当解释器退出时调用该扩展?
答案 0 :(得分:1)
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值。
答案 1 :(得分:0)
没有一般的“解释器退出”钩子。但Ruby会在正常出口上进行垃圾收集,包括Module和Class对象,并且有一种方法可以挂钩对象垃圾回收。因此,您可以调整以下代码,这些代码同样适用于Ruby解释对象或C库定义的对象:
module MyLib
end
ObjectSpace.define_finalizer( MyLib, proc { puts "MyLib unloaded" } )
您需要注意避免在运行此代码时仍然存在您期望可用的其他模块或类对象的假设,您无法完全控制在程序退出时调用它的顺序。 / p>