从信号处理程序返回并保持屏蔽信号

时间:2011-04-03 16:54:24

标签: c synchronization posix signals atomic

我遇到一种情况,信号处理程序需要在某些条件下返回而不会自动取消屏蔽,即在返回信号之后应该在线程的信号掩码中保持阻塞状态。使用longjmp跳出信号处理程序将不起作用,因为我需要返回到正常信号处理程序返回中断的确切点。除了使用从标准中删除的ucontext_t之外,是否有任何符合要求的方法?我不能改变信号处理程序或处置;所有效果必须是线程的本地效果。

此代码的目的与某些原子操作以及竞争条件或死锁的可能性有关。基本上可能被中断的代码如下:

atomic_write(&thread_local_flag, 1);
atomic_dec(&global_counter);

如果标志已设置且计数器递减,则一切正常且信号处理程序无关,但信号可能在两条指令之间到达。在这种情况下,信号处理程序想要立即返回并让减量继续进行,但是该过程正在被信号轰击(意图由所有线程接收以实现奥术同步目的)并且它有可能永远循环(或者在至少在无限时间内处理信号,而其他线程从不接收信号。

如果我在信号处理程序返回时可以阻止信号,那就没问题了。

1 个答案:

答案 0 :(得分:0)

嗯,我到目前为止找到的最好的......这似乎有效,并且不依赖于任何ucontext函数,只取决于未删除的结构。在信号处理程序中:

if (thread_local_flag) {
    sigaddset(&((ucontext_t *)ctx)->uc_sigmask, sig);
    return;
}

此处sigctx分别是SA_SIGINFO - 类型信号处理程序的第一个和第三个参数。

有关这是正确用法还是可怕的黑客攻击(或两者兼而有之)的任何想法?