首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制退出Lua脚本

强制退出Lua脚本
EN

Stack Overflow用户
提问于 2011-08-02 22:50:44
回答 10查看 19.7K关注 0票数 27

如何结束长时间运行的Lua脚本?

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

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

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

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-08-17 03:10:09

您可以使用setjmplongjump,就像Lua库在内部所做的那样。这将使您脱离pcalls,无需不断出错,防止脚本试图处理您的假错误,而仍然使您退出执行。(不过,我不知道这对线程有多好。)

代码语言:javascript
复制
#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;
}
票数 18
EN

Stack Overflow用户

发布于 2011-08-16 03:48:27

您可以在程序中的某个位置设置一个变量,并将其命名为类似forceQuitLuaScript的名称。然后,你使用一个钩子,描述here来运行每条n指令。在n指令之后,它将运行您的钩子,检查是否设置了forceQuitLuaScript,如果设置了钩子,则执行所需的清理并终止线程。

编辑:这是一个简单的例子,演示了它是如何工作的,只是这是单线程的。这仅仅是为了说明您可能如何处理pcall等:

代码语言:javascript
复制
#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;
}
票数 7
EN

Stack Overflow用户

发布于 2011-08-03 00:41:17

结束脚本的方法是通过调用error引发一个错误。但是,如果用户通过pcall调用脚本,则会捕获此错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6913999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档