c - 从信号处理程序返回并使信号屏蔽

标签 c synchronization posix signals atomic

我遇到了一种情况,在某些情况下,信号处理程序需要在不取消屏蔽的情况下返回,即在返回后,信号应在线程的信号屏蔽中保持阻塞状态。用 longjmp 跳出信号处理程序将不起作用,因为我需要返回到像正常信号处理程序返回一样被中断的确切点。除了使用 ucontext_t 之外,是否有任何一致的方法可以做到这一点?哪些是从标准中删除的?我不能改变信号处理程序或处置;所有效果都必须是线程本地的。

此代码的目的与一些原子操作和竞争条件或死锁的可能性有关。基本上潜在中断的代码如下所示:

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

如果已设置标志且计数器递减,则一切正常且信号处理程序无事可做,但信号可能会在两条指令之间到达。在这种情况下,信号处理程序希望立即返回并让递减继续进行,但是该进程正受到信号的轰炸(旨在由所有线程接收以实现神秘的同步目的)并且它有可能永远循环(或在至少在无限时间内)处理信号,而其他线程从不接收它们的信号。

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

最佳答案

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

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

这里sigctxSA_SIGINFO 的第一个和第三个参数-type 信号处理程序,分别。

关于这是正确的用法还是可怕的黑客(或两者)的任何想法?

关于c - 从信号处理程序返回并使信号屏蔽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5531006/

相关文章:

shell - SUS/POSIX shell 兼容的 '-nt' 测试替换

c++ - POSIX 队列配置

c - `clear` 导致 undefined reference 错误

c - realloc导致程序崩溃

c - 我无法使打开/读取/关闭低级功能在 Ubuntu 中工作

java - 在 Swing 事件监听器中阻止调用

关于返回静态缓冲区指针的函数的 C11 线程安全

c++ - 发布安全、宽松的内存模型和 memcpy

iphone - ZSync 教程 - 在设备之间同步 CoreData 数据

bash - 在 bash 中重命名文件的陷阱