c调用lua出现死锁怎么解决?

c调用lua出现死锁怎么解决?,第1张

在C中调用Lua函数的API主要由以下几个:

(1)void lua_call (lua_State *L, int nargs, int nresults)

函数调用,nargs表示参数的个数,nresults表示返回值的个数

首先将lua函数压栈,然后将参数依次压栈,最后调用函数即可

函数调用时,参数和函数都会pop出栈,调用返回后,结果会push进栈

nresults==LUA_MULTRET,所有的返回值都会push进栈

nresults!=LUA_MULTRET,返回值个数根据nresults来调整

Lua语句:

a = f("how", t.x, 14)

在C中的实现:

lua_getglobal(L, "f") // 函数入栈

lua_pushstring(L, "how")  // 参数1入栈

lua_getglobal(L, "t")// 表t入栈

lua_getfield(L, -1, "x") // 参数2入栈

lua_remove(L, -2) // 跳t出栈

lua_pushinteger(L, 14)// 参数3入栈

lua_call(L, 3, 1) // 调用函数,参数和函数都会出栈

lua_setglobal(L, "a")// 给a赋值,栈顶出栈

上述代码执行完毕后,堆栈状态恢复原样。

(2)int lua_pcall (lua_State *L, int nargs, int nresults, int msgh)

函数调用,在安全模式下,并且可以添加错误处理函数。

如果调用期间发生error,lua_pcall会捕获之,然后push stack一个错误信息(会先将函数和参数pop出栈),并且返回一个error code(非0的一个值)。

发生error时,如果指定了错误处理函数,会在error message入栈前调用错误处理函数,具体由msgh参数来决定:

(1)msgh==0,不指定错误处理函数,入栈信息不变;

(2)msgh!=0,msgh表示错误处理函数的堆栈index,错误处理函数会以error message为参数,并将返回的新的error

message入栈。主要用来给error

message添加更多的debug信息,比如堆栈跟踪,因为这些信息在pcall调用完之后是收集不到的。

函数返回代码:

LUA_OK(0):调用成功

LUA_ERRRUN:runtime error

LUA_ERRMEM:内存分配错误,这种情况下不会调用错误处理函数

LUA_ERRERR:调用错误处理函数时出错,当然,不会再进一步调用错误处理函数

LUA_ERRGCMM:调用metamethod.__gc时报错,由gc引起,和函数本身没关系

(3)int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, int ctx, lua_CFunction k)

函数调用,在安全模式下,并且允许函数yield

到目前为止,没有相关运算符。5.2 以前标准库不提供按位操作函数,5.2 开始标准库 bit32 提供按位操作的函数。比如下面的代码只可以可以用在 5.2 及以后版本。

12

> print(bit32.bor(1, 2))3

保存和运行

运行可以通过 Lua 的交互模式,也可以用记事本编辑代码保存为 .lua 的格式,通过 lua 编译器运行。也可以通过第三方工具,将 lua 打包独立运行。

目标

Lua的目标是成为一个很容易嵌入其它语言中使用的语言。大多数程序员也认为它的确做到了这一点。

很多应用程序、游戏使用LUA作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。这其中包括魔兽世界、博德之门、愤怒的小鸟、QQ三国、VOCALOID3、太阳神三国杀、游戏王ygocore等。

特性

轻量级

轻量级Lua语言的官方版本只包括一个精简的核心和最基本的库。这使得Lua体积小、启动速度快,从而适合嵌入在别的程序里。5.0.2版的Lua的内核小于120KB,而Python的内核大约860KB,Perl的内核大约1.1MB。 [3]

可扩展

可扩展 Lua并不象其它许多"大而全"的语言那样,包括很多功能,比如网络通讯、图形界面等。但是Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。

其它特性

Lua还具有其它一些特性:同时支持面向过程(procedure-oriented)编程和函数式编程(functional programming);自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程 [4]  ,并非操作系统所支持的线程)支持;通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。

应用场景

游戏开发 [1]

独立应用脚本

Web 应用脚本

扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench

安全系统,如入侵检测系统


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/654707.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-23
下一篇2023-07-23

发表评论

登录后才能评论

评论列表(0条)

    保存