【问题标题】:Lua shutdown/End of the program execution callbackLua 关闭/程序执行结束回调
【发布时间】:2011-04-24 03:51:57
【问题描述】:

我正在为 Lua 编写一个模块。在关闭 lua 解释器时,即使用户忘记隐式调用关闭例程,它也必须运行清理例程。

该模块大部分是用C编写的。

我应该使用 Lua C Api 中的什么回调来检测程序执行的结束?我想到的唯一想法是在代表我的模块的表上使用 __gc 元方法。有什么想法吗?

【问题讨论】:

    标签: c lua luabind


    【解决方案1】:

    从 C 模块中,简单的做法是使用 metatable__gc 元方法创建完整的 userdata。将其存储在模块环境中的一个字段中,以便在卸载模块之前它不会被 GC 收集。

    根据the manual,只有userdata 获得了由收集器调用的__gc 元方法,因此您不能使用表格来保存模块的终结器。

    对于需要终结器的纯 Lua 编写的模块,您仍然需要有一个 userdata 来支持它。不受支持且未记录但广为人知的函数newproxy() 可用于创建一个空的userdata,并带有用于此目的的元表。将其称为 newproxy(true) 以获取具有元表的对象,并使用 getmetatable() 检索元表,以便您可以将 __gc 元方法添加到其中。

    【讨论】:

    • 似乎工作正常(在 lua 模块内部 - 关闭是一个关闭例程)
    • local shutdownproxy = newproxy(true) -- 使用新的元表创建代理对象 assert(type(shutdownproxy) == 'userdata') getmetatable(shutdownproxy).__gc = function() print "GC"; ivrworx.close();打印“GC1”;结束
    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 2022-09-23
    • 2017-07-01
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多