BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #34089同步于 2009/12/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于信号的阻塞问题

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