参考《UNIX环境高级编程》P283
进程间的跳转: setjmp / longjmp
goto语句是不能跨函数的,而执行这种类型跳转功能的函数是setjmp / longjmp,废话少说,直接看函数API
goto — end
longjmp — setjmp
#include<setjmp.h>
int setjmp(jmp_buf env);
返回值:若直接使用,返回0;若从longjmp返回,返回longjmp的第二个参数val
void longjmp(jmp_buf env, int val);
线程间的跳转:sigsetjmp / siglongjmp
int sigsetjmp(jmp_buf env, int savemask);
返回值:若直接使用,返回0;若从longjmp返回,返回longjmp的第二个参数val
当 savemask != 0 时,sigsetjmp在env中[保存]进程当前的信号屏蔽字!
void siglongjmp(jmp_buf env, int val);
siglongjmp执行完跳转到sigsetjmp位置时,将把信号屏蔽字集恢复到sigsetjmp保存的集合
引出原因:
调用longjmp会有一个问题。当捕捉到一个信号A时,进入信号A捕捉函数,此时当前信号A会被自动的加入到信号屏蔽字中(将导致后面产生信号A被屏蔽)。如果用longjmp跳出信号处理函数而转到setjmp位置,信号屏蔽字集不一定能恢复到调用setjmp时的。(按道理讲,应该信号屏蔽字恢复到之前的情况)
总结为一句话:为了解决不能恢复信号屏蔽字的问题,引出了sigsetjmp / siglongjmp !