我想抓住SIGVTALRM
发送的setitimer
,我不知道为什么它不起作用。这是我的代码:
void time(int time) {
cout << "time" << endl;
exit(0);
}
int main(void) {
signal(SIGVTALRM, time);
itimerval tv;
tv.it_value.tv_sec = 5;
tv.it_value.tv_usec = 0;
tv.it_interval.tv_sec = 5;
tv.it_interval.tv_usec = 0;
setitimer(ITIMER_VIRTUAL, &tv, NULL);
while (true) {
cout << "waiting" << endl;
}
return 0;
}
由于某种原因它永远不会调用time()
- 是因为它没有捕获信号,或者因为信号没有在我不知道的第一个地方发送。
应该很简单。有任何想法吗?感谢
答案 0 :(得分:0)
你确定它不起作用吗?
一切看起来都不错。可能你还没等到。由于您在循环内打印字符串waiting
并且您正在使用虚拟计时器,因此时钟仅在进程运行时(不包括IO时间)进行计时。所以实际上你的计时器可能会在几个(> 5)秒后过期。
尝试注释掉打印部分。
答案 1 :(得分:0)
这是由signal
功能引起的。如http://manpages.ubuntu.com/manpages//precise/en/man2/signal.2.html中所述:
The behavior of signal() varies across UNIX versions, and has also varied historically across different versions of Linux. Avoid its use: use sigaction(2) instead.
所以主要方法应该是:
int main(void) {
itimerval tv;
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = timer_handler;
if (sigaction(SIGVTALRM, &sa, NULL) == -1) {
printf("error with: sigaction\n");
exit(EXIT_FAILURE);
}
tv.it_value.tv_sec = 5;
tv.it_value.tv_usec = 0;
tv.it_interval.tv_sec = 5;
tv.it_interval.tv_usec = 0;
setitimer(ITIMER_VIRTUAL, &tv, NULL);
while (true) {
cout << "waiting" << endl;
}
return 0;
}