【问题标题】:C `SIGVTALRM` is not handled when `sigwait` or `pause`当`sigwait`或`pause`时不处理C`SIGVTALRM`
【发布时间】: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 根本没有递减(请注意,这只是我的怀疑)。为什么会这样?有没有办法在仍然使用计时器的同时解决这个问题?

【问题讨论】:

    标签: c multithreading timer signals posix


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 2017-11-13
      • 2011-06-07
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多