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

时间:2017-04-16 01:44:25

标签: c multithreading timer signals posix

引用计划来源部分下http://man7.org/linux/man-pages/man3/pthread_sigmask.3.html处提供的代码。

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

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

看起来ITIMER_VIRTUAL根本没有减少(注意这只是我的怀疑)。为什么会这样?有没有办法在使用计时器时解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果您使用SIGVTALRM发送kill,则应该会很快到达。问题不在于信号传递,而在于你误解了“虚拟时间”的含义。当你的线程正在休眠/阻塞等待某事时没有通过,所以计时器永远不会过期。也许你想要真正的而不是虚拟的时间。