从C API调用的Lua脚本的执行时间限制 有没有办法为两个C++语句加上执行时间限制(比如10-20秒),加载然后执行一个LUA文件?< /P>

从C API调用的Lua脚本的执行时间限制 有没有办法为两个C++语句加上执行时间限制(比如10-20秒),加载然后执行一个LUA文件?< /P>,c++,c,lua,lua-api,C++,C,Lua,Lua Api,由于Lua文件不可信,我不希望恶意用户在Lua代码中无限循环地无限期挂起程序 标记C,因为LuaAPI是C,标记C++,因为我使用C++ +/p>有LuaaSethook,它可以用来告诉解释器在执行了每个“计数”指令后调用钩子。通过这种方式,您可以监视用户脚本,并在它耗尽其配额时终止它: luaL_loadfile(mState, path.c_str()); lua_pcall(mState, 0, 0, 0); 这也可以从Lua中使用: debug.sethook(函数()打印(“今天就足

由于Lua文件不可信,我不希望恶意用户在Lua代码中无限循环地无限期挂起程序


标记C,因为LuaAPI是C,标记C++,因为我使用C++ +/p>有LuaaSethook,它可以用来告诉解释器在执行了每个“计数”指令后调用钩子。通过这种方式,您可以监视用户脚本,并在它耗尽其配额时终止它:

luaL_loadfile(mState, path.c_str());
lua_pcall(mState, 0, 0, 0);
这也可以从Lua中使用:

debug.sethook(函数()打印(“今天就足够了”);os.exit(0);end,”,10000)
对于i=110000,请结束
如果使用中的技术,则可以完全从Lua使用
sethook()
和friends设置安全的执行环境,然后在执行用户脚本时切换到沙盒模式。我在这里尝试过,只是为了让你开始:

--设置执行配额
本地功能集\u配额(秒)
本地st=os.clock()
函数检查()
如果os.clock()-st>secs,则
debug.sethook()--禁用挂钩
错误(“超出配额”)
结束
结束
调试.sethook(选中“”,100000);
结束
--这些是全局对象,用户可以使用:
本地环境={print=print}
--允许用户代码运行5秒钟。
设定配额(5)
--在以下环境下运行代码:
本地函数运行(不受信任的\u代码)
本地不受信任的\u函数,消息=加载字符串(不受信任的\u代码)
如果不是不受信任的函数,则返回nil,消息结束
setfenv(不受信任的_函数,env)
返回pcall(不受信任的函数)
结束
--以下是用户代码:
本地用户脚本=[[
函数fib(n)
如果n
 int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);