我遇到一种情况,信号处理程序需要在某些条件下返回而不会自动取消屏蔽,即在返回信号之后应该在线程的信号掩码中保持阻塞状态。使用longjmp
跳出信号处理程序将不起作用,因为我需要返回到正常信号处理程序返回中断的确切点。除了使用从标准中删除的ucontext_t
之外,是否有任何符合要求的方法?我不能改变信号处理程序或处置;所有效果必须是线程的本地效果。
此代码的目的与某些原子操作以及竞争条件或死锁的可能性有关。基本上可能被中断的代码如下:
atomic_write(&thread_local_flag, 1);
atomic_dec(&global_counter);
如果标志已设置且计数器递减,则一切正常且信号处理程序无关,但信号可能在两条指令之间到达。在这种情况下,信号处理程序想要立即返回并让减量继续进行,但是该过程正在被信号轰击(意图由所有线程接收以实现奥术同步目的)并且它有可能永远循环(或者在至少在无限时间内处理信号,而其他线程从不接收信号。
如果我在信号处理程序返回时可以阻止信号,那就没问题了。
答案 0 :(得分:0)
嗯,我到目前为止找到的最好的......这似乎有效,并且不依赖于任何ucontext
函数,只取决于未删除的结构。在信号处理程序中:
if (thread_local_flag) {
sigaddset(&((ucontext_t *)ctx)->uc_sigmask, sig);
return;
}
此处sig
和ctx
分别是SA_SIGINFO
- 类型信号处理程序的第一个和第三个参数。
有关这是正确用法还是可怕的黑客攻击(或两者兼而有之)的任何想法?