2011-04-03 57 views
3

我有一种情况,即在某些情况下,信号处理程序需要返回而不自己屏蔽,即在返回信号应保持阻塞在线程的信号屏蔽后。跳出longjmp的信号处理程序将不起作用,因为我需要返回到像正常信号处理程序返回一样中断的确切点。是否有任何符合要求的方式来执行此操作,但使用从标准中删除的ucontext_t?我不能更改信号处理程序或处置;所有的效果必须是线程本地的。从信号处理程序返回并将信号屏蔽

这段代码的目的是处理一些原子操作和潜在的竞态条件或死锁。基本上,可能中断代码如下所示:

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

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

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

回答

0

嗯,迄今为止发现的最好的..这似乎工作,并不取决于任何ucontext函数,只是没有删除的结构。在信号处理程序:

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

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

任何想法是否这是正确的用法或一个可怕的黑客(或两者)?