当 `sigwait` 或 `pause` 时,C `SIGVTALRM` 不被处理

C `SIGVTALRM` is not handled when `sigwait` or `pause`

参考程序源部分http://man7.org/linux/man-pages/man3/pthread_sigmask.3.html处提供的代码。

对该代码的更改是:1) SIGVTALRM 被阻止,而不是 SIGQUIT & SIGUSR12 )在评论部分(/* Main thread carries on to create other threads and/or do other work */)之后用setitimer(2)设置了一个计时器。

如果我们使用 pause(2)(如示例中的情况),SIGVTALRM 以外的信号似乎被正确处理(例如 SIGINT,甚至 SIGALRM)代码)或 sigwait(3)SIGVTALRM 只有当主线程忙等待使用 while(1); 时才能正确处理(替换示例代码中的 pause();)。

看起来ITIMER_VIRTUAL根本没有递减(注意这只是我的猜测)。为什么会这样?有没有办法在仍然使用计时器的情况下解决这个问题?

如果您将 SIGVTALRMkill 一起发送,它应该会很好地到达。问题不在于信号传递,而是您误解了 "virtual time" 的含义。 None 在您的线程 sleeping/blocked 等待某事时通过,因此计时器永远不会过期。也许你想要真实而不是虚拟的时间。