longjmp和siglongjmp的区别
发布网友
发布时间:2022-06-01 20:00
我来回答
共1个回答
热心网友
时间:2023-10-14 14:31
Linux的异常处理
基于setjmp和longjmp的运行控制方式是Linux平台上C语言处理异常的标准方案,已被广泛运用到由C语言开发的软件系统和链接库中,例如jpg解析库,加密解密库等等。setjmp和longjmp是以C语言标准库函数的形式提供的,setjmp函数能够保存程序当前的执行环境,即程序的状态,该被保存的程序状态可以在随后程序执行的某一点被longjmp函数恢复,程序的控制流也将跳转到调用setjmp时的执行点,实现非本地局部跳转("non-local goto")的机制。
问题描述:
在编写基于异常的代码混淆程序时,signal注册的异常信号处理程序只能执行一次,第二次发生异常时异常处理函数没有被调用。
分析:
1. 搞清楚Linux的信号处理流程:
[1] 收到信号,例如SIGFPE
[2] 进入signal注册的信号处理函数,此时,SIGFPE自动被加入到进程信号屏蔽字
[3] 执行信号处理函数
[4] 信号处理结束,恢复信号屏蔽字,SIGFPE被取消阻塞
[5] 返回到产生信号地方继续执行
2. 分析异常处理函数没有被调用的原因:
异常信号处理函数在结束前没有取消对SIGFPE信号的阻塞,直接调用longjmp()进行控制流转移。所以在后面的执行过程中再次遇到SIGFPE信号,系统会自动根据 信号屏蔽字进行屏蔽,异常处理函数也就无法被调用。
3. 该问题的解决办法:
使用sigsetjmp和siglongjmp函数替换setjmp和longjmp函数。siglongjmp功能与longjmp类似,不同的是siglongjmp会自动恢复进程的信号屏蔽字,因此相同的异常信号再次发生时就不会被系统屏蔽了。
进入信号处理函数,是不是会自动把进入信号
使用sigsetjmp和siglongjmp函数替换setjmp和longjmp函数。siglongjmp功能与longjmp类似,不同的是siglongjmp会自动恢复进程的信号屏蔽字,因此相同的异常信号再次发生时就不会被系统屏蔽了。
proximity ligation assay 原理是什么?
Duolink PLA技术可通过同一个实验即可完成对蛋白质互作及其修饰的检测、定量以及确定细胞定位等。Duolink基于原位PLA技术(即邻位连接分析技术),可以帮助您在内源蛋白质表达过程中进行该分析。
LLM部署(1) | 检测CPU支持的指令集架构特性
它在不同平台下有两份实现,分别针对Windows和*nix系统。在*nix系统中,使用setjmp/longjmp处理SIGILL异常。当SIGILL发生时,若CPU支持该指令,则继续执行代码,取消异常处理;否则,通过siglongjmp返回原始状态,判断不支持指令。
Linux C函数实例速查手册的目录
5.17 longjmp函数:跳到原先setjmp存储的堆栈环境5.18 on_exit函数:设置程序正常结束前调用的函数5.19 setjmp函数:存储当前堆栈环境5.20 setgid函数:设置进程的进程组ID5.21 setuid函数:设置进程组ID5.22 setpriority函数:设置程序进程优先级5.23 siglongjmp函数:跳到原先sigset jmp存储的堆栈环境5.24 sigsetjmp函数:存储当前堆...
usleep函数的注意事项
如果信号捕捉功能的中断usleep()检查或变化的时间sigalrm将产生,与sigalrm信号相关的动作,或是否sigalrm信号被阻止从交货,结果是不确定的。如果信号捕捉功能的中断usleep()和电话siglongjmp(