如何从C控制Lua脚本(暂停,恢复,终止)?

时间:2013-12-06 22:27:31

标签: c lua

我有一个运行一些LUA脚本的c应用程序。 Lua脚本运行一个单独的任务。

我想知道如何暂停Lua脚本并重新恢复它,我的意思是整个脚本不只是一个函数?

我还希望完全终止正在运行的脚本。

2 个答案:

答案 0 :(得分:3)

您想要的是创建一个沙箱,您还可以在其中跟踪资源利用率。 Lua wiki有a page on sandboxing

该页面有一个相当全面的Lua库列表及其从沙箱中允许的相对安全性。最好的建议是要小心你提供哪些系统功能,特别是要根据已知安全和需要的功能白名单为沙箱创建一个环境,而不是依赖于将你知道危险的一些功能列入黑名单

然而,即使是空的环境仍然会让用户故意(或意外)造成问题。 while(true) end是明显的情况,但即使是简单的案例也会造成麻烦。所以为了避免这种麻烦,通常的建议是做你要问的那种事情。在单独的线程中运行用户提供的脚本,并在必要时使用外部控件来停止线程。

执行此操作的一种方法是在沙箱中启动用户脚本时在监视器线程中设置警报。当警报触发时,您将终止用户脚本。描述了这种技术in the mailing list。这将我们带到您的实际问题。

您可以使用Lua实例中的调试挂钩设置定期重新获得控制,如果设置了全局标志(警报处理程序将执行此操作),则干净地退出线程。但是,仍然可以将Lua代码卡在它调用的C代码中,并且调试钩子永远不会触发。要处理这种情况,您可能必须使用操作系统级别功能来终止Lua线程,并通过一些聪明的方法处理诸如悬挂文件句柄,数据库连接或其他搁浅资源之类的后果。

答案 1 :(得分:2)

情侣选择:

  1. 通过操作系统功能控制线程:将其置于休眠状态或暂停或使其等待信号量等。您可以使用操作系统的线程控制功能恢复它。你当然也可以终止线程(杀死它)。
  2. 使用你的C推送Lua作为全局变量的标志,你的脚本会检查它们并相应地采取行动(暂停工作等)。