Lua与C语言间的交互实例
lua 是一门轻巧、灵活、扩展性很强的脚本语言,它可以很容易的嵌入到其他语言(c/c++)中使用,这主要得益于其提供了功能强大的 c api,这让其跟 c/c++ 间的互调成为一件很轻松的事。
lua 调用 c
lua 调用 c 函数,其实就是把 c 函数注册到 lua 中去,把 c 函数地址传递给 lua 解释器。这个传递是要遵循一个的协议的,即:
typedef int (*lua_cfunction)(lua_state* l)
lua 和 c 是通过栈(state)来交互的,lua 调用 c 函数时,首先 lua 把数据拷贝到栈上,然后 c 从栈上获取数据,调用结束后将返回结果放到栈中。栈中的每个数据通过索引值进行定位,索引值为正时表示相对于栈底的偏移索引,索引值为负时表示相对于栈顶的偏移索引,索引值以1或-1为起始值,因此栈顶索引值永远为-1 ,栈底索引值永远为1 。栈相当于数据在 lua 和 c 之间的中转站,每一个 c 函数都有自己的独立的私有栈。
利用 lua 提供的 c api,调用 c 函数很简单,例如下面例子:
#include <math.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
static int l_sin (lua_state *l)
{
double d = lual_checknumber(l, 1);
lua_pushnumber(l, sin(d));
return 1;
}
static const struct lual_reg mylib [] = {
{"lsin", l_sin},
{null, null}
};
int luaopen_mylib(lua_state *l)
{
lual_openlib(l, "mylib", mylib, 0);
return 1;
}
把上面代码编译成一个静态资源的 so 文件,加入把上面代码保存在一个名为 mylib.c 的文件下,把它编译成一个名为 libmylib.so 的静态资源文件里,gcc 编译语句如下:
gcc mylib.c -fpic -shared -o libmylib.so
把上面代码放在 lua_cpath 目录下(lua_cpath 目录位置说明详看《lua 学习笔记(4) -- 模块与包》,这里就不多说了)。
把 libmylib.so 资源文件加载到模块目录下后,就可以在 lua 代码里直接加载 require 进来使用,例如如下使用:
require "mytestlib"
print(mylib1.lsin(10))
上一篇: 利用expect命令实现Shell自动化交互的方法详解
下一篇: SQL数据查询之——单表查询