C++ 捕捉信号
我正在尝试捕获setitimer发送的SIGVTALRM,但我不知道为什么它不起作用。这是我的密码:C++ 捕捉信号,c++,signals,C++,Signals,我正在尝试捕获setitimer发送的SIGVTALRM,但我不知道为什么它不起作用。这是我的密码: 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;
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;
}
出于某种原因,它从不调用时间——是因为它没有捕捉到信号,还是因为信号一开始就没有发出,我不知道
应该很简单。有什么想法吗?谢谢您确定它不起作用吗 我觉得一切都很好。也许你等待的时间不够。由于您正在打印循环中等待的字符串,并且您正在使用虚拟计时器,因此,时钟只在进程运行IO时滴答作响,不包括IO时间。因此,实际上,计时器可能会在几秒钟>5秒后过期
请尝试注释打印部分。您确定打印部分不工作吗 我觉得一切都很好。也许你等待的时间不够。由于您正在打印循环中等待的字符串,并且您正在使用虚拟计时器,因此,时钟只在进程运行IO时滴答作响,不包括IO时间。因此,实际上,计时器可能会在几秒钟>5秒后过期 尝试注释打印部分。这是由于信号功能。如中所述: 因此,主要的方法应该是:
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;
}
这是由于信号功能。如中所述:
因此,主要的方法应该是:
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;
}
你的意思是它不起作用?这有点笼统:没错,我已经编辑了这个问题。它永远不会进入时间,所以我认为它可能没有捕捉到信号你的意思是它不起作用?这有点笼统:没错,我已经编辑了这个问题。它从不进入时间,所以我认为它可能没有捕捉到信号