我有一个c应用程序,它运行一些LUA脚本。Lua脚本运行一个单独的任务。
我想知道如何暂停Lua脚本并再次恢复它,我的意思是整个脚本而不仅仅是一个函数?
我还想完全终止一个正在运行的脚本。
发布于 2013-12-07 09:17:34
您想要的是创建一个沙箱,您还可以在其中跟踪资源利用率。Lua维基有a page on sandboxing。
该页面有一个相当全面的Lua库列表,以及它们在沙箱中允许的相对安全性。最好的建议是小心您提供的系统函数,尤其是基于已知安全和需要的函数的白名单为沙箱创建环境,而不是依赖于只将几个您知道是危险的函数列入黑名单。
然而,即使是一个空的环境仍然允许用户故意(或无意地)造成问题。while(true) end是显而易见的案例,但即使是简单的出现案例也可能带来麻烦。因此,为了避免这种麻烦,通常的建议是按照你要求的那样去做。在单独的线程中运行用户提供的脚本,并在必要时使用外部控件停止线程。
要做到这一点,一种方法是在沙箱中启动用户脚本时在监视器线程中设置警报。当警报触发时,您将终止用户脚本。这种技术在in the mailing list中有描述。这就引出了你的实际问题。
您可以使用在Lua实例中设置的调试钩子定期重新获得控制权,如果设置了全局标志,则干净利落地退出线程(警报处理程序会这样做)。然而,仍然有可能使Lua代码卡在它调用的C代码中,并且调试钩子永远不会触发。要处理这种情况,您可能必须使用操作系统级别的功能来终止Lua线程,并通过一些巧妙的方法处理诸如悬空文件句柄、数据库连接或其他搁浅资源等后果。
发布于 2013-12-07 09:13:47
配对选项:
https://stackoverflow.com/questions/20434687
复制相似问题