【问题标题】:Ruby C extension: Is there a way to finalize?Ruby C 扩展:有没有办法完成?
【发布时间】:2014-04-04 02:02:15
【问题描述】:

我已经浏览了所有关于 Ruby C 扩展的文档,但没有找到好的结果。

对于在解释器退出时调用的初始化 C 扩展的 Init_... 方法是否有补充?

【问题讨论】:

标签: ruby ruby-c-extension


【解决方案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 值。

【讨论】:

  • 完美运行!
【解决方案2】:

没有通用的“解释器退出”钩子。但是 Ruby 会在正常退出时对所有内容进行垃圾收集,包括 Module 和 Class 对象,并且有一种方法可以挂钩对象垃圾收集。因此,您可以修改以下代码,使其同样适用于 Ruby 解释对象或由 C 库定义的对象:

module MyLib
end

ObjectSpace.define_finalizer( MyLib, proc { puts "MyLib unloaded" } )

您需要注意避免在运行此代码时假设您期望可用的其他模块或类对象仍然存在,您无法完全控制程序退出时调用它的顺序。

【讨论】:

    猜你喜欢
    • 2021-01-05
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多