0
我想使用下面的C++代码等待预定义的时间量(在这个例子中总是2秒),但仍然可以被信号中断(这就是为什么我不' t使用睡眠):setitimer信号似乎只能在分支后工作
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/time.h>
#include <signal.h>
#include <iostream>
using namespace std;
int measure() {
itimerval idle;
sigset_t sigset;
int sig;
idle.it_value.tv_sec = 2;
idle.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &idle, NULL); // TODO: check return value
sigemptyset(&sigset);
sigaddset(&sigset, SIGALRM); // TODO return values
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_BLOCK, &sigset, NULL); // TODO return value?
sigwait(&sigset, &sig); // TODO check return value
while(sig != SIGUSR1) {
cout << "Hohoho" << endl;
idle.it_value.tv_sec = 2;
idle.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &idle, NULL); // TODO: check return value
sigwait(&sigset, &sig); // TODO check return value
}
cout << "Done with measurements." << endl;
return 0;
}
int main(int argc, char **argv) {
//if(fork() != 0) exit(0);
//if(fork() == 0) exit(0);
return measure();
}
我希望此代码每2秒打印一次“Hohoho”,直到它收到SIGUSR1。然后打印出“完成测量”。并退出。第二部分按预期工作。但是,我没有看到“Hohoho”,所以在我看来,setitimer的SIGALRM不知何故未收到。奇怪的是,如果我之前做了一个分支,程序按预期工作。更具体地说,如果我在最后取消注释两个fork命令中的任何一个,它就可以工作。因此它不依赖于它是父进程还是子进程,但不知何故fork事件很重要。有人可以向我解释发生了什么事以及如何解决我的代码?
非常感谢, 卢茨
谢谢,鸭。在我真实的代码中,我不想一次又一次地设置相同的时间,但确定报警后的下一个时间间隔。所以我应该将it_interval设置为0,然后像上面的代码中那样显式重置计时器。我首先犯了一个错误,但最终修复了它。再次感谢。 – PowerGnom