带有SIG#U块的sigprocmask不';t块信号

带有SIG#U块的sigprocmask不';t块信号,c,sigprocmask,C,Sigprocmask,这是一个示例程序,用于检查sigprocmask是否实际阻止了与我的计时器相关的SIGALRM信号。事实证明不是这样。即使信号被阻塞,我的处理程序也会被调用。如果有人能指出原因,我将不胜感激。代码如下: #include <signal.h> #include <time.h> #include <stdio.h> #include <stdlib.h> timer_t timer_ID; static void timer_handler(i

这是一个示例程序,用于检查sigprocmask是否实际阻止了与我的计时器相关的SIGALRM信号。事实证明不是这样。即使信号被阻塞,我的处理程序也会被调用。如果有人能指出原因,我将不胜感激。代码如下:

#include <signal.h> 
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

timer_t timer_ID;
static void timer_handler(int signo, siginfo_t *sig_info, void *sig_ucontext){  
    if(sig_info->si_value.sival_ptr != &timer_ID){
        printf("This signal is stray and didnt come from the timer we setup. Exiting the program!\n");
        exit(1);
     }
     else{
        printf("Caught signal %d from timer\n", signo);
     }
     return;
}//func end

void main(void)
{   
    struct sigevent sev;         // for creating the timer  
    sigset_t sigmask;   
    struct sigaction sa = {0};          
    struct itimerspec its;  
    its.it_interval.tv_sec = 0;
    its.it_interval.tv_nsec = 500000; 

    its.it_value.tv_sec = its.it_interval.tv_sec;
    its.it_value.tv_nsec = its.it_interval.tv_nsec;

    sa.sa_flags = SA_SIGINFO | SA_RESTART; 
    sa.sa_sigaction = timer_handler;

    if (sigaction(SIGALRM, &sa, NULL) == -1){
       fprintf(stderr, "sigaction register error\n");
       exit(1);
    }   
    //BLOCK SIG
    sigemptyset (&sigmask);
    sigaddset (&sigmask, SIGALRM);
    if (sigprocmask(SIG_BLOCK, &sigmask, NULL) == -1) {
        fprintf (stderr, "Failed to set signal mask!\n");
        exit (1);
    }   

    //CREATE TIMER
    sev.sigev_signo = SIGALRM; 
    sev.sigev_notify = SIGEV_SIGNAL; 
    sev.sigev_value.sival_ptr = &timer_ID; 

    if(timer_create(CLOCK_MONOTONIC, &sev, &timer_ID) != 0){ 
        printf("Create timer error!\n");        
        exit (1);
    } 
    // START TIMER
    if(timer_settime(timer_ID, 0, &its, NULL) !=0){
        printf("ERROR setting the timer!!!!\n");
        exit(1);
    }

    while(1);  //signal is blocked so should never go to handler
}//main end
#包括
#包括
#包括
#包括
计时器\u t计时器\u ID;
静态void timer_处理程序(int signo,siginfo_t*sig_info,void*sig_ucontext){
如果(sig_info->si_value.sival_ptr!=&timer_ID){
printf(“此信号是杂散的,不是来自我们设置的计时器。正在退出程序!\n”);
出口(1);
}
否则{
printf(“从计时器捕获的信号%d\n”,signo);
}
返回;
}//func端
真空总管(真空)
{   
struct sigfevent sev;//用于创建计时器
sigset_t sigsmask;
结构sigaction sa={0};
结构itimerspec its;
its.it_interval.tv_sec=0;
its.it\u interval.tv\u nsec=500000;
its.it_value.tv_sec=its.it_interval.tv_sec;
its.it\u value.tv\u nsec=its.it\u interval.tv\u nsec;
sa.sa_flags=sa_SIGINFO | sa_重启;
sa.sa_sigaction=计时器处理程序;
if(sigaction(SIGALRM,&sa,NULL)=-1){
fprintf(stderr,“sigaction寄存器错误\n”);
出口(1);
}   
//块信号
SIGEPTYSET(&sigmask);
sigaddset(&sigmask,SIGALRM);
if(sigprocmask(SIG_块和sigmask,NULL)=-1){
fprintf(stderr,“设置信号掩码失败!\n”);
出口(1);
}   
//创建计时器
sev.sigev_signo=SIGALRM;
sev.sigev_notify=sigev_信号;
sev.sigev_value.sival_ptr=&timer_ID;
if(timer\u create(CLOCK\u MONOTONIC,&sev,&timer\u ID)!=0{
printf(“创建计时器错误!\n”);
出口(1);
} 
//启动计时器
if(timer\u settime(timer\u ID,0,&its,NULL)!=0){
printf(“设置计时器时出错!!!!\n”);
出口(1);
}
while(1);//信号被阻止,因此不应转到处理程序
}//主端

在调用
timer\u create()
timer\u settime()
之后,您是否检查了阻塞信号集?也许他们正在解除阻止。在我修复了您的编译问题(如
sa
的声明缺失)后,我无法重新编译。您的程序在启动后只是以静默方式运行。很抱歉没有提前提供所有的#include。为什么你不能重现这个错误?它和POSIX版本有什么关系吗?因为我的一直在打电话给处理程序。我还通过在timer\u create()和timer\u settime()函数之前和之后插入assert(sigismember(&sigmask,SIGALRM)==1)来检查信号掩码。它过去了。我甚至打印出了sigmask的所有成员。SIGALRM是面具的一员。但是代码不知怎么地一直掉到处理程序中。我的应用程序中没有设置任何其他处理程序或计时器。这就是全部代码。在x86_64体系结构上使用linux内核3.10.0