强制Lua脚本退出

前端之家收集整理的这篇文章主要介绍了强制Lua脚本退出前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
你如何结束一个长期运行的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;
}

猜你在找的Lua相关文章