当`sigwait`或`pause`时不处理C`SIGVTALRM`
Posted
技术标签:
【中文标题】当`sigwait`或`pause`时不处理C`SIGVTALRM`【英文标题】:C `SIGVTALRM` is not handled when `sigwait` or `pause` 【发布时间】:2017-04-16 01:44:24 【问题描述】:引用http://man7.org/linux/man-pages/man3/pthread_sigmask.3.html程序源部分下提供的代码。
对该代码的更改是:1) SIGVTALRM
被阻止而不是 SIGQUIT
和 SIGUSR1
,2) 使用 @987654325 设置了一个计时器@在评论部分之后(/* Main thread carries on to create other threads and/or do other work */
)。
如果我们使用pause(2)
(如示例代码中的情况)或sigwait(3)
,则SIGVTALRM
以外的信号似乎得到了正确处理(例如SIGINT
,甚至SIGALRM
)。 SIGVTALRM
仅在使用 while(1);
的主线程忙等待时正确处理(替换示例代码中的 pause();
)。
看起来ITIMER_VIRTUAL
根本没有递减(请注意,这只是我的怀疑)。为什么会这样?有没有办法在仍然使用计时器的同时解决这个问题?
【问题讨论】:
【参考方案1】:如果您发送SIGVTALRM
和kill
,它应该可以到达。问题不在于信号传递,而是您误解了“虚拟时间”的含义。当您的线程正在休眠/阻塞等待某事时,没有任何通过,因此计时器永远不会过期。也许您想要真实而不是虚拟的时间。
【讨论】:
以上是关于当`sigwait`或`pause`时不处理C`SIGVTALRM`的主要内容,如果未能解决你的问题,请参考以下文章
Linux (Fedora 13) 与 OS X 中的 sigwait