返回信息流程序是想等待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;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #34089同步于 2009/12/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于信号的阻塞问题
tomharold
2009/12/23镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
可以看看《APUE》上相关章节的例程吧
我只看过《CSAPP》上异常那章的例程
【 在 tomharold 的大作中提到: 】
: 在哪里调用signal()??
【 在 tomharold 的大作中提到: 】
: 程序是想等待2秒钟的时间,所以将定时器设置为2秒钟后到期然后产生一个SIGALRM信号,这期间通过waitforever()阻塞其他任何信号只等待SIGALRM信号,在信号处理函数里将timerexpired的值设置为1并且输出一条信息表示接收到了SIGALRM信号
: 但是在调试的过程中在设置定时器之后发现wairforever()解除了阻塞,但是没有将timerexpired的值设置为1,说明没有调用信号处理函数,这是为什么呢? 程序如下:
: int blockinterrupt(void) {
: ...................
SIGALRM信号处理函数呢? 用signal注册下SIGALRM处理函数就ok了
你搞混了一点:信号的处理不是从当前被挂起的进程的位置开始执行,而是根据相应的信号类型获取注册信号处理函数,然后执行相应的信号类型处理函数。
信号处理函数我写了也加载到SIGALRM信号上了, 只是没放到帖子上,函数主要就是在接收到SIGALRM信号后,将
timerexpired置为1,然后输出一个信息
但是每次定时器到期产生SIGLALRM信号之后 并没有看到输出的那个信息,而且timerexpired也没有被置1,所以感到很奇怪,岂不是没有进入处理函数?
【 在 jmpesp 的大作中提到: 】
: SIGALRM信号处理函数呢? 用signal注册下SIGALRM处理函数就ok了
: 你搞混了一点:信号的处理不是从当前被挂起的进程的位置开始执行,而是根据相应的信号类型获取注册信号处理函数,然后执行相应的信号类型处理函数。