2009-05-14 33 views
5

Mi situación es que estoy usando la API de Lua (C) para ejecutar un script en una cadena. Me gustaría que el usuario pueda finalizar la ejecución del script (esto es esencial si el script contiene un ciclo infinito), ¿cómo puedo hacer esto?¿Cómo puedo finalizar un hilo de Lua limpiamente?

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

Respuesta

7

Puede usar un gancho para hacer una devolución de llamada a C cada vez que lua ejecuta una línea del script. En esta función de enlace, puede verificar si el usuario quería salir y llamar a lua_error si lo hiciera.

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); 
+0

Gracias por su tiempo. – CiscoIPPhone

+0

Probablemente quiera llamar 'luaL_error (L," message ")' o presionar algo en la pila Lua antes de llamar a 'lua_error (L)'. –

+0

Gracias Alexander, he editado la respuesta. Estás en lo cierto acerca de los bucles de una sola línea/bucles infinitos en el código C, admito que no ahondé en las complejidades de la situación. –

8

Hook on lines no es suficiente. Este código es una sola línea, pero se repite para siempre:

while true do end 

Debe establecer un enganche de conteo de instrucciones. Si no me equivoco, eso sería

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

Usted quiere elegir NUM_INSTRUCTIONS por lo que no es demasiado pequeña (o se obtiene una sobrecarga de rendimiento) y no demasiado grande (o tendrá que esperar demasiado tiempo hasta que el tope)

Para la implementación relacionada con solo Lua, consulte this library.

Si desea agregar más protección contra el código Lua que no es de confianza, busque "Lua sandboxing" en google: hay mucho más que solo prevención de bucle infinito.

+0

Estás en lo correcto. ¿No debería el tercer parámetro ser LUA_MASKCOUNT? Incluso las instrucciones solo no son ideales, por ejemplo, si el código Lua se apaga y llama a una función larga C. Sin embargo, lo hará por mis propósitos por ahora, gracias. – CiscoIPPhone

+0

Sí, lo siento. He agregado LUA_MASKCOUNT ahora. –

Cuestiones relacionadas