![](/img/trans.png)
[英]How can I cleanly specify which arguments I am passing and which remain default?
[英]How can I end a Lua thread cleanly?
我的情况是我使用Lua(C)API来执行字符串中保存的脚本。 我希望用户能够终止脚本的执行(如果脚本包含无限循环,这是必不可少的),我该怎么做?
lua_State *Lua = lua_open();
char * code;
// Initialisation code
luaL_dostring(L, code);
挂线是不够的。 此代码是单行,但永远循环:
while true do end
您需要设置指令计数挂钩。 如果我没有弄错的话,那就是
lua_sethook(Lua, &LineHookFunc, LUA_MASKCOUNT, NUM_INSTRUCTIONS);
你想选择NUM_INSTRUCTIONS,因此它不会太小(或者你得到性能开销)并且不会太大(或者你会等到太长时间才停止)。
对于相关的Lua实现,请参阅此库 。
如果你想从不受信任的Lua代码添加更多保护,谷歌搜索“Lua沙盒” - 除此之外还有更多的无限循环预防。
每次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;
// Initialisation code
lua_sethook(Lua, &LineHookFunc, LUA_MASKLINE, 0);
luaL_dostring(L, code);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.