当前位置:   article > 正文

lua c如何退出当前执行的lua脚本_lua退出程序

lua退出程序

lua c如何退出当前执行的lua脚本

  1. 设置钩子函数
lua_sethook(currL, exitLuaScript, LUA_MASKCALL , 0);
  • 1

参数说明:

LUA_MASKCALL 调用函数时回调: 在调用一个函数对象之前,都会先调用luaD_precall,在这个函数里触发事件。
LUA_MASKRET 函数返回时回调:完成一个函数时,会先调用luaD_poscall,在这个函数里触发事件。
LUA_MASKLINE 执行一行时代码时回调,vmfetch中每执行一条指令,都会调用luaG_traceexec函数,在其中判断新行并触发事件
LUA_MASKCOUNT 每执行count条指令时回调,vmfetch中每执行一条指令,都会调用luaG_traceexec函数,在其中判断是否执行了count条件指令并触发事件。
  • 1
  • 2
  • 3
  • 4
  1. 在钩子函数中使用c库的longjmp()
static int exitLuaScript_flag = 0; 
static jmp_buf place;
static void exitLuaScript(lua_State* L, lua_Debug *ar)
{
		if(exitLuaScript_flag==1){
			exitLuaScript_flag = 0;
        	longjmp(place, 1);
		}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. 在需要跳转到的点设置setjmp
ret = setjmp(place);
if(ret==0){
	//设置place, 
}else{
	//有值表示longjmp返回.
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

longjmp setjmp 使用demo

#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
 
jmp_buf env;
 
int my_test(int a, int b) {
    if (b == 0) {
        printf("test 0\n");
        longjmp(env, 1);
    }
    return a / b;
}
 
int main(int argc, char const *argv[]) {
    int res = setjmp(env);
    if (res == 0) { //执行my_func方法
        printf("return from setjmp\n");
        my_func(10, 0);
    } else {//遇到longjmp,则进入该分支
        printf("return from longjmp: %d\n", res);
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/859096
推荐阅读
相关标签
  

闽ICP备14008679号