非局部跳转 之 setjmp / longjmp、sigsetjmp / siglongjmp

参考《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 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值