调用sigsetjmp(非零参数)后执行sigemptyset是否会使其效果失效?
关于sigsetjmp与手动清空saved_mask的等价性确认
先看你给出的第一段代码:
sigsetjmp(env, 1); sigemptyset(&env->__saved_mask);
你提出的疑问是:第二行代码是否会使sigsetjmp第二个参数设为非零的意义失效?并且认为这段代码等价于:
sigsetjmp(env, 0);
结论是:你的判断完全正确,这两段代码是完全等价的。
原因如下:
- 当
sigsetjmp的第二个参数为非零值时,函数会将当前线程的信号掩码保存到env结构体的__saved_mask成员中,这个操作的意义是为后续调用siglongjmp时恢复该信号掩码做准备。 - 而你紧接着调用
sigemptyset(&env->__saved_mask),直接将保存下来的信号掩码清空为全0集合,这就完全抵消了sigsetjmp(env,1)保存信号掩码的行为,最终效果和一开始就指定sigsetjmp不保存信号掩码(即第二个参数设为0)完全一致。
你的调试结果也验证了这一点:两种写法最终env->__saved_mask均为全0,说明它们在信号掩码的处理逻辑上没有任何差异,后续调用siglongjmp时,都不会恢复任何之前的信号掩码。
内容的提问来源于stack exchange,提问作者danienachumdev
相关产品推荐
相关产品推荐

