|
程序是想等待2秒钟的时间,所以将定时器设置为2秒钟后到期然后产生一个SIGALRM信号,这期间通过waitforever()阻塞其他任何信号只等待SIGALRM信号,在信号处理函数里将timerexpired的值设置为1并且输出一条信息表示接收到了SIGALRM信号
但是在调试的过程中在设置定时器之后发现wairforever()解除了阻塞,但是没有将timerexpired的值设置为1,说明没有调用信号处理函数,这是为什么呢? 程序如下:
int blockinterrupt(void) {
sigset_t intmask,oldmask;
if ((sigemptyset(&intmask)==-1)||(sigaddset(&intmask,SIGALRM)==-1)) {
perror("Failed to init the sigmask");
return -1;
}
if (sigprocmask(SIG_BLOCK,&intmask,NULL)==-1) {
perror("Failed to block the SIGALRM");
return -1;
}
return 0;
}
int sethardwaretimer(long interval) {
struct itimerval value;
value.it_interval.tv_sec=0;
value.it_interval.tv_usec=0;
value.it_value.tv_sec=interval;
value.it_value.tv_usec=0;
return (setitimer(ITIMER_REAL,&value,NULL));
}
void waitforever(void) {
sigset_t sigset;
int signo;
if ((sigemptyset(&sigset)==-1)||(sigaddset(&sigset,SIGALRM)==-1)||(sigprocmask(SIG_BLOCK,&sigset,NULL)==-1))
fprintf(stderr,"Failed to block SIGALRM");
if (sigwait(&sigset,&signo)==-1)
fprintf(stderr,"Failed to wait SIGALRM");
}
int main(void) {
timerexpired=0;
blockinterrupt();
sethardwaretimer(timers.active[n]);
while(!timerexpired)
waitforever();
return 0;
} |
|