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

标签 c lua

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

我想知道如何暂停 Lua 脚本并再次恢复它,我的意思是整个脚本而不仅仅是一个函数?

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

最佳答案

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

该页面有一个相当全面的 Lua 库列表及其允许沙箱使用的相对安全性。最好的建议是要小心您提供的系统功能,尤其是根据已知安全且需要的功能白名单创建沙箱环境,而不是仅仅将您知道危险的一些功能列入黑名单.

但是,即使是空的环境仍然会允许用户故意(或意外)引起问题。 while(true) end 是显而易见的情况,但即使是简单的出现情况也会引起麻烦。因此,为了避免这种麻烦,通常的建议是做你要求的事情。在单独的线程中运行用户提供的脚本,并在必要时使用外部控件来停止线程。

一种方法是在沙箱中启动用户脚本时在监视器线程中设置警报。当警报响起时,您将终止用户脚本。该技术描述为 in the mailing list 。这让我们想到了您的实际问题。

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

关于c - 如何从 C 控制 Lua 脚本(暂停、恢复、终止)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20434687/

相关文章:

regex - 如何在Lua中写一个等价于/(\(\))?$/in js的正则表达式

c++ - 从预乘浮点 RGBA 转换为 8 位 RGBA 的有效方法?

arrays - 如何在Lua中制作2D阵列?

function - 在 ipairs() 中使用函数时,LÖVE 崩溃

c - 将结构传递给函数并在 C 中修改它

c - Readline (libedit) 非标准输入

arrays - 为什么Lua数组(表)从1开始而不是从0开始?

c - 多次读取相同的输入 - C

计算插入排序的步骤数

c++ - 如何使用 C/C++ 可视化字节