强制Lua脚本退出

你如何结束一个长期运行的Lua脚本?

我有两个线程,一个运行主程序,另一个控制用户提供的Lua脚本。我需要杀死正在运行Lua的线程,但首先我需要脚本退出

有没有办法强制脚本退出

我已经阅读,建议的方法是返回一个Lua异常。然而,它不保证用户的脚本将调用api函数(它可能在一个紧张的忙循环)。此外,用户可以通过使用pcall来防止错误导致他的脚本退出

解决方法

你可以使用setjmp和longjump,就像Lua库在内部。这将让你从pcalls和东西很好,不需要连续的错误,防止脚本尝试处理你的虚假错误,仍然让你失去执行。 (我不知道这与线程有多好)。
#include <stdio.h>
#include <setjmp.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

jmp_buf place;

void hook(lua_State* L,lua_Debug *ar)
{
    static int countdown = 10;
    if (countdown > 0)
    {
        --countdown;
        printf("countdown: %d!\n",countdown);
    }
    else
    {
        longjmp(place,1);
    }
}

int main(int argc,const char *argv[])
{
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    lua_sethook(L,hook,LUA_MASKCOUNT,100);

    if (setjmp(place) == 0)
        luaL_dostring(L,"function test() pcall(test) print 'recursing' end pcall(test)");

    lua_close(L);
    printf("Done!");
    return 0;
}

相关文章

1.github代码实践源代码是lua脚本语言,下载th之后运行thmai...
此文为搬运帖,原帖地址https://www.cnblogs.com/zwywilliam/...
Rime输入法通过定义lua文件,可以实现获取当前时间日期的功能...
localfunctiongenerate_action(params)localscale_action=cc...
2022年1月11日13:57:45 官方:https://opm.openresty.org/官...
在Lua中的table(表),就像c#中的HashMap(哈希表),key和...