LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 656|回复: 0

关于信号的阻塞问题

[复制链接]
发表于 2009-12-23 14:46:50 | 显示全部楼层 |阅读模式
程序是想等待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;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表