首页 文章

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

提问于
浏览
3

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

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

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

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

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

1 回答

  • 0

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

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

    这里 sigctx 分别是 SA_SIGINFO -型信号处理程序的第一个和第三个参数 .

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

相关问题