信号处理函数执行完怎么办
一般来讲,信号处理函数执行完毕都会正常返回,也可以调用其他函数返回到程序的主函数中。这里总结一下信号处理函数执行完毕后跳转到主函数中指定的位置的操作(有点类似goto语句,但goto不支持函数间的跳转,只能在一个函数中跳转),主要是通过俩对函数来实现的:
setjmp()/longjmp()
sigsetjmp()/siglongjmp()
下面对俩组函数进行分析。
setjmp()/longjmp()
在信号处理函数中使用longjmp()
函数可以使信号处理函数直接跳转到setjmp()
函数的位置,这俩个函数的原型如下:
#include <setjmp.h>
int setjmp( jmp_buf env );
void longjmp( jmp_buf env, int val );
- 参数env是一个全局变量,存放的是在调用longjmp()时能用来恢复栈状态的所有信息,用户无需去配置这个参数,longjmp()会自动将信息存进去。
- 参数val,在longjmp()跳转到setjmp()时,setjmp()的返回值就是val的值,所以当多个longjmp()跳转时,通过判断setjmp()的返回值就可以判断是从哪里跳转的。
下面通过一个程序来分析一下setjmp()/longjmp()的用法和不足:
<