你如何结束一个长期运行的Lua脚本?
我有两个线程,一个运行主程序,另一个控制用户提供的Lua脚本。我需要杀死正在运行Lua的线程,但首先我需要脚本退出。
有没有办法强制脚本退出?
我已经阅读,建议的方法是返回一个Lua异常。然而,它不保证用户的脚本将调用api函数(它可能在一个紧张的忙循环)。此外,用户可以通过使用pcall来防止错误导致他的脚本退出。
解决方法
你可以使用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; }