当 `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
& SIGUSR1
、2 )在评论部分(/* 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
根本没有递减(注意这只是我的猜测)。为什么会这样?有没有办法在仍然使用计时器的情况下解决这个问题?
如果您将 SIGVTALRM
与 kill
一起发送,它应该会很好地到达。问题不在于信号传递,而是您误解了 "virtual time" 的含义。 None 在您的线程 sleeping/blocked 等待某事时通过,因此计时器永远不会过期。也许你想要真实而不是虚拟的时间。
参考程序源部分http://man7.org/linux/man-pages/man3/pthread_sigmask.3.html处提供的代码。
对该代码的更改是:1) SIGVTALRM
被阻止,而不是 SIGQUIT
& SIGUSR1
、2 )在评论部分(/* 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
根本没有递减(注意这只是我的猜测)。为什么会这样?有没有办法在仍然使用计时器的情况下解决这个问题?
如果您将 SIGVTALRM
与 kill
一起发送,它应该会很好地到达。问题不在于信号传递,而是您误解了 "virtual time" 的含义。 None 在您的线程 sleeping/blocked 等待某事时通过,因此计时器永远不会过期。也许你想要真实而不是虚拟的时间。