Как я могу закончить Lua поток чисто? - PullRequest
5 голосов
/ 14 мая 2009

Моя ситуация в том, что я использую Lua (C) API для выполнения скрипта, содержащегося в строке. Я хотел бы, чтобы пользователь мог прекратить выполнение сценария (это важно, если сценарий содержит бесконечный цикл), как я могу это сделать?

lua_State *Lua = lua_open();
char * code;
// Initialisation code
luaL_dostring(L, code);

Ответы [ 2 ]

8 голосов
/ 15 мая 2009

Крюк на линиях не достаточно. Этот код представляет собой одну строку, но зацикливается навсегда:

    while true do end

Вам нужно установить хук подсчета команд. Если я не ошибаюсь, это будет

    lua_sethook(Lua, &LineHookFunc, LUA_MASKCOUNT, NUM_INSTRUCTIONS);

Вы хотите выбрать NUM_INSTRUCTIONS, чтобы он не был слишком маленьким (или вы понизили производительность) и не слишком большим (или вы будете ждать слишком долго, пока не остановитесь).

Для связанной реализации только для Lua см. эту библиотеку .

Если вы хотите добавить больше защиты от ненадежного кода Lua, поищите в «песочнице» Lua больше, чем просто предотвращение бесконечных циклов.

7 голосов
/ 14 мая 2009

Вы можете использовать ловушку для обратного вызова C каждый раз, когда lua выполняет строку сценария. В этой функции ловушки вы можете проверить, хочет ли пользователь выйти, и вызвать lua_error, если он это сделал.

static bool ms_quit = false;

void IWantToQuit()
{
    ms_quit = true;
}

void LineHookFunc(lua_State *L, lua_Debug *ar)
{
    if(ar.event == LUA_HOOKLINE)
        if(ms_quit == true)
            luaL_error(L, "Too Many Lines Error");
}
//...

lua_State *Lua = lua_open();
char * code;
// Initialisation code
lua_sethook(Lua, &LineHookFunc, LUA_MASKLINE, 0);
luaL_dostring(L, code);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...