如何干净地结束Lua线程?

我的情况是使用 Lua (C) API 来执行存储在一个字符串中的脚本。 我希望用户能够终止脚本的执行(如果脚本包含无限循环,这是必要的),我该如何做到这一点?

lua_State *Lua = lua_open();
char * code;
// 初始化代码
luaL_dostring(L, code);

原文链接 https://stackoverflow.com/questions/862256

点赞
stackoverflow用户106967
stackoverflow用户106967

你可以使用一个钩子函数,在每次 Lua 执行脚本的一行代码时回调到 C 代码。 在这个钩子函数中,你可以检查用户是否想要退出,如果是,就调用 lua_error 函数。

static bool ms_quit = false;

void IWantToQuit()
{
    ms_quit = true;
}

void LineHookFunc(lua_State *L, lua_Debug *ar)
{
    if(ar.event == LUA_HOOKLINE)
        if(ms_quit == true)
            luaL_error(L, "Too Many Lines Error");
}
//...

lua_State *Lua = lua_open();
char * code;
// 初始化代码
lua_sethook(Lua, &LineHookFunc, LUA_MASKLINE, 0);
luaL_dostring(L, code);
2009-05-14 10:40:40
stackoverflow用户6236
stackoverflow用户6236

钩子函数行数不够。以下代码只有一行,但是会无限循环:

while true do end

你需要设置一个指令计数的钩子。如果我没有弄错的话,应该是这样的:

lua_sethook(Lua, &LineHookFunc, LUA_MASKCOUNT, NUM_INSTRUCTIONS);

你需要选择合适的 NUM_INSTRUCTIONS,既不要太小(否则会超过性能开销),也不要太大(否则等待时间太长直到停止)。

如果你想要添加更多防止不受信任的 Lua 代码的保护,请搜索 "Lua 沙箱",这不仅仅涉及到无限循环的预防。对于相关的仅限于 Lua 实现,请参阅 这个库

2009-05-14 22:49:45