当`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 被阻止而不是 SIGQUITSIGUSR12) 使用 @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】:

如果您发送SIGVTALRMkill,它应该可以到达。问题不在于信号传递,而是您误解了“虚拟时间”的含义。当您的线程正在休眠/阻塞等待某事时,没有任何通过,因此计时器永远不会过期。也许您想要真实而不是虚拟的时间。

【讨论】:

以上是关于当`sigwait`或`pause`时不处理C`SIGVTALRM`的主要内容,如果未能解决你的问题,请参考以下文章

Linux (Fedora 13) 与 OS X 中的 sigwait

在c ++中逐个字符从字符串传递到int时不精确

Unix系统编程 信号部分学习笔记

[Firebase 消息传递]:应用程序在后台时不调用后台消息处理程序方法?

C语言中system("pause")是啥作用和意思

请详细讲解下批处理文件echo、@、call、pause、rem 命令的具体用法以及含义