当前位置: 首页 > news >正文

注册c模块到lua中使用

#define REGISTER_CUSTOM_LIBRARY(name, lua_c_fn) \
int lua_c_fn(lua_State*); \
luaL_requiref(L, name, lua_c_fn, 0); \
lua_pop(L, 1) /* remove lib */

//注册c模块
void open_custom_libs(lua_State* L) {
//core
REGISTER_CUSTOM_LIBRARY("moon.core", luaopen_moon_core);

}

//c模块中的函数

int LUAMOD_API luaopen_moon_core(lua_State* L) {luaL_Reg l[] = { { "clock", lmoon_clock },{ "md5", lmoon_md5 },{ "tostring", lmoon_tostring },{ "timeout", lmoon_timeout },{ "log", lmoon_log },{ "loglevel", lmoon_loglevel },{ "cpu", lmoon_cpu },{ "send", lmoon_send },{ "new_service", lmoon_new_service },{ "kill", lmoon_kill },{ "scan_services", lmoon_scan_services },{ "queryservice", lmoon_queryservice },{ "next_sequence", lmoon_next_sequence },{ "env", lmoon_env },{ "server_stats", lmoon_server_stats },{ "exit", lmoon_exit },{ "now", lmoon_now },{ "adjtime", lmoon_adjtime },{ "callback", lua_service::set_callback },{ "decode", message_decode },{ "redirect", message_redirect },{ "collect", lmi_collect },{ "escape_print", escape_print },{ "signal", moon_signal },/* placeholders */{ "id", NULL },{ "name", NULL },{ "timezone", NULL },{ NULL, NULL } };luaL_newlib(L, l);const lua_service* S = lua_service::get(L);lua_pushinteger(L, S->id());lua_setfield(L, -2, "id");lua_pushlstring(L, S->name().data(), S->name().size());lua_setfield(L, -2, "name");lua_pushinteger(L, moon::time::timezone());lua_setfield(L, -2, "timezone");return 1;
}

上边代码是moon框架中注册core模块的操作,可以看出主要是调用了luaL_requiref和lua_pop。luaL_requiref会在LOADED表中查找key为modname的值是否存在,不存在就调用lua_call执行传入的openf函数(luaopen_moon_core),最后调用lua_pop弹出栈上的LOADED表。

image

 luaopen_moon_core又干了什么事情呢,查看源码可以发现调用了luaL_newlib创建一个表(根据luaL_Reg数组)key和value分别对应字符串和注册的函数。

有趣的是,moon还添加了额外的字段到表中,代码如下:

image

 

lua_pushinteger(L, S->id());    //栈顶压入int值
lua_setfield(L, -2, "id");      //在-2位置的表中(luaL_newlib创建在栈上的),向表中插入元素(key为“id”,value为栈顶元素t["id"]=value,然后弹出int值,需要注意这里弹出只是移动了栈指针,并不会清空元素,因为栈元素其实是一个union+类型枚举,所以可以复用栈元素(即使下次push的不是int值也无所谓,tt_和value_会设置对应的值)

企业微信截图_1760083066120

 

结论:

注册moon.core模块完成后,LOADED表的内容格式如下:

image

 在lua中使用模块:

-- 当用户执行 require "moon.core" 时
local moon = require "moon.core"-- 此时 moon 变量指向 package.loaded["moon.core"] 表
print(moon.id)        -- 访问特殊字段
print(moon.name)
print(moon.timezone)-- 调用函数
local t = moon.clock()  -- 调用 lmoon_clock 函数
local hash = moon.md5("hello")  -- 调用 lmoon_md5 函数

 

http://www.jsqmd.com/news/11005/

相关文章:

  • S3Bucket安全评分与合规状态逻辑修复:全面提升云存储安全评估准确性 - 详解
  • DNA权威书籍
  • 220V转5V500mA非隔离电源芯片WT5105
  • linux基础-find查找
  • 220V转12V电机水泵供电驱动WT5105
  • 禁止或启用键盘修改输入法
  • 智能提取表格从pdf, 图片 到 excel, csv
  • 实践与认识及其发展规律
  • 完整教程:阿里云瓴羊发布企业级AI智能体服务平台AgentOne,成就AI时代的“超级公司”
  • 利用MCP Server革新软件测试:更智能、更高效的自动化
  • 数据结构-设计一个算法删除单链表L(有头节点)中的最小结点。
  • 可视化图解算法63:单词搜索
  • AI大模型应用实践 八:如何通过RAG数据库实现大模型的私有化定制与优化
  • ARM芯片架构之CoreSight高效的系统架构规范
  • 【完结11章】基于Golang+Gin+Gorm+Vue3母婴商城项目实战
  • 25-1010 从房间回声看懂离散卷积原理
  • (13)ASP.NET Core2.2 中的选项模式(Options) - 教程
  • 如何设计10亿用户级的微博Feed流系统并应对100W QPS的挑战?
  • 印度尼西亚股票实时数据API对接文档
  • 2025 年铝门窗厂家推荐榜,系统 / 智能 / 断桥 / 窄边 / 定制 / 全景 / 阳光房 / 隐框 / 隔声 / 防火铝门窗公司推荐
  • 如何播放 M3U8 格式的视频
  • 20232304 2025-2026-1 《网络与系统攻防技术》实验一实验报告
  • lsh 的源码注释(1)
  • Codeforces Round 1056 (Div. 2) A~D
  • 现代软件工程阅读和提问作业-1
  • 一种CDN动态加速回源白名单选路及降低源站探测量的方法
  • Windows系统-应用问题全面剖析Ⅰ:德承工控机DA-1200在Windows操作系统下[开机黑屏]的解决方法 - Johnny
  • Java文件路径/服务器路径的获取
  • 某中心在旧金山设立AGI实验室专注长期AI研究
  • Appcrawler自动遍历工具-智能遍历测试与测试用例生成