强制Lua脚本退出

def*_*ode 27 lua

你如何结束长期运行的Lua脚本?

我有两个线程,一个运行主程序,另一个控制用户提供的Lua脚本.我需要杀死正在运行Lua的线程,但首先我需要脚本退出.

有没有办法强制脚本退出?

我已经读过,建议的方法是返回一个Lua异常.但是,并不保证用户的脚本将调用api函数(它可能处于紧张的繁忙循环中).此外,用户可以通过使用a来防止错误导致他的脚本退出pcall.

Ale*_*lex 18

你可以使用setjmplongjump,就像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;
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 7

你可以在你的程序中的某个地方设置一个变量,然后调用它forceQuitLuaScript.然后,您使用一个钩子,在这里描述运行每个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;
}
Run Code Online (Sandbox Code Playgroud)