通过lua_pcall和lua_call可以实现,在lua脚本中调用C函数,这个C函数同时可以回调lua中的函数。标准库中有很多个函数都是这样实现的,比如table.sort可以调用排序函数;string.gsub可以调用替换函数;pcall和xpcall在保护模式下调用函数。我们是否还记得,lua的主要代码是通过C(主程序)来调用的,所以我们得到一条调用链条:C(主程序)--> Lua(脚本)--> C(库)--> Lua(回调函数)。
Lua通常可以很容易的处理这样的调用链条;毕竟和C混合使用是Lua的特点。然而,一个意外的情况是在使用coroutines(线程)的时候,这样的交错调用会碰到一些问题。
lua中的每个线程都有它自己的栈,栈中保存着等待调用的线程信息。具体的讲,栈中存放着:返回地址、参数和每次调用的局部变量。为了调用lua函数,解析器使用合适的数据结构来实现这个栈,这里称之为soft stack(软栈)。然而,为了调用C函数,同样解析器必须使用C的栈,因为返回地址、局部变量都存放在C的栈中。
解析器可以做到同时拥有多个soft stack,但是ANSI C的runtime只能有一个内部的栈(译者注:runtime同一个时间只能拥有一个栈)。因此,当一个lua线程执行C函数的时候不能被挂起:lua线程从resume到yield之间,如果调用了C函数;那么当lua线程yield的时候,lua并不能保存当前C函数的执行信息,所以当lua线程从新resume的时候,lua就不能恢复C函数的执行信息。pcall函数是一个C函数,因此lua不能将它挂起,原因是lua不能挂起ANSI C函数,并将它恢复。
分享到:
相关推荐
Programming in Lua--中文版
Windows版:lua-utf8.dll(若是用在openresty中,openresty版本需使用32位版本,使用64位版本时会报错“lua-utf8.dll 不是有效的 Win32 应用程序”) 将lua-utf8库放在openresty安装目录下,使用时用require引入。
Programming in Lua第四版,学习lua的经典书籍,有多种格式。
该资源是通过github上的EmmyLua-AttachDebugger编译生成的,可支持ideal 2020和rider2020以上版本的unity调试lua
Programming in Lua Fourth edition 英文版(Lua程序设计)
而lua-resty-template和大多数模板引擎是类似的,大体内容有: 模板位置:从哪里查找模板; 变量输出/转义:变量值输出; 代码片段:执行代码片段,完成如if/else、for等复杂逻辑,调用对象函数/方法; 注释:解释...
EmmyLua-AttachDebugger-1.0.0.4 最新intellij 断点调试
对于任何需要简单,高效,可扩展,便携和免费的脚本语言的人来说,Lua都是首选语言。目前,Lua正在从嵌入式系统到Web开发等领域使用,并在游戏行业广泛传播,对Lua的了解是无可争议的资产。
lua-nginx-module-0.10.13
安装nginx_lua模块时候需要先安装nginx的依赖包,安装命令rpm -ivh lua-devel-5.1.4-4.1.el6.x86_64.rpm
LUA-cjson已经编译 LUA-cjson已经编译 LUA-cjson已经编译 LUA-cjson已经编译 LUA-cjson已经编译 LUA-cjson已经编译
Programming in Lua(中文版).pdf电子书,高清扫描版
lua-resty-redis-connector-master lua-resty的redis库 lua-resty的redis库
安装lua-language-server 可以用于nvim中lua代码自动补全 使用方法可参考文章: https://blog.csdn.net/lxyoucan/article/details/120292520
这是编译好的dll(带demo),cURL比luacurl功能强大的多,项目源码及使用: https://github.com/Lua-cURL/Lua-cURLv3
lua-5.4.2_Win64_bin
添加书签,方便查阅
lua-devel-5.3.4-12.el8.aarch64
nginx集成lua脚本模块,配合nginx和ngx_devel_kit一起使用,注意lua_nginx_module的版本号,否则会出现时间类型不兼容