如何结束长时间运行的Lua脚本?
我有两个线程,一个运行主程序,另一个控制用户提供的Lua脚本。我需要杀死运行Lua的线程,但首先我需要退出脚本。
有没有办法强制脚本退出?
我读到过建议的方法是返回一个Lua异常。但是,不能保证用户的脚本会调用api函数(它可能处于紧凑的繁忙循环中)。此外,用户可以通过使用pcall防止错误导致其脚本退出。
发布于 2011-08-17 03:10:09
您可以使用setjmp和longjump,就像Lua库在内部所做的那样。这将使您脱离pcalls,无需不断出错,防止脚本试图处理您的假错误,而仍然使您退出执行。(不过,我不知道这对线程有多好。)
#include <stdio.h>
#include <setjmp.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
jmp_buf place;
void hook(lua_State* L, lua_Debug *ar)
{
static int countdown = 10;
if (countdown > 0)
{
--countdown;
printf("countdown: %d!\n", countdown);
}
else
{
longjmp(place, 1);
}
}
int main(int argc, const char *argv[])
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
lua_sethook(L, hook, LUA_MASKCOUNT, 100);
if (setjmp(place) == 0)
luaL_dostring(L, "function test() pcall(test) print 'recursing' end pcall(test)");
lua_close(L);
printf("Done!");
return 0;
}发布于 2011-08-16 03:48:27
您可以在程序中的某个位置设置一个变量,并将其命名为类似forceQuitLuaScript的名称。然后,你使用一个钩子,描述here来运行每条n指令。在n指令之后,它将运行您的钩子,检查是否设置了forceQuitLuaScript,如果设置了钩子,则执行所需的清理并终止线程。
编辑:这是一个简单的例子,演示了它是如何工作的,只是这是单线程的。这仅仅是为了说明您可能如何处理pcall等:
#include <stdlib.h>
#include "lauxlib.h"
void hook(lua_State* L, lua_Debug *ar)
{
static int countdown = 10;
if (countdown > 0)
{
--countdown;
printf("countdown: %d!\n", countdown);
}
else
{
// From now on, as soon as a line is executed, error
// keep erroring until you're script reaches the top
lua_sethook(L, hook, LUA_MASKLINE, 0);
luaL_error(L, "");
}
}
int main(int argc, const char *argv[])
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
lua_sethook(L, hook, LUA_MASKCOUNT, 100);
// Infinitely recurse into pcalls
luaL_dostring(L, "function test() pcall(test) print 'recursing' end pcall(test)");
lua_close(L);
printf("Done!");
return 0;
}发布于 2011-08-03 00:41:17
结束脚本的方法是通过调用error引发一个错误。但是,如果用户通过pcall调用脚本,则会捕获此错误。
https://stackoverflow.com/questions/6913999
复制相似问题