2013-01-24 85 views
0

我正在和Linux一起工作,尝试与信号处理有关的代码。以下代码我正在尝试,但我无法理解此代码的行为。pthread_sigmask:不寻常的行为

/**Globally declared variable**/ 

    time_t start, finish; 
    struct sigaction sact; 
    sigset_t new_set, old_set,test; 
    double diff; 

/**Function to Catch Signal**/ 
void catcher(int sig) 
{ 
    cout<< "inside catcher() function\n"<<endl; 
} 


void Initialize_Signalhandler() 
{ 

    sigemptyset(&sact.sa_mask); 
    sact.sa_flags = 0; 
    sact.sa_handler = catcher; 
    sigaction(SIGALRM, &sact, NULL); 

    sigemptyset(&new_set); 
    sigaddset(&new_set, SIGALRM); 

} 


/**Function called by thread**/ 
void *threadmasked(void *parm) 
{ 

/**To produce delay of 10sec**/ 
     do { 
     time(&finish); 
     diff = difftime(finish, start); 
    } while (diff < 10); 

    cout<<"Thread Exit"<<endl; 

} 


int main(int argc, char *argv[]) { 

    Initialize_Signalhandler(); 

    pthread_t a; 
    pthread_create(&a, NULL, threadmasked, NULL); 

    pthread_sigmask(SIG_BLOCK, &new_set, &old_set); 

    time(&start); 
    cout<<"SIGALRM signals blocked at %s\n"<< ctime(&start) <<endl; 


    alarm(2); //to raise SIGALM signal 


/**To produce delay of 10sec**/ 
     do { 
     time(&finish); 
     diff = difftime(finish, start); 
    } while (diff < 10); 


return(0); 
} 

即使thoght我使用 “pthread_sigmask(SIG_BLOCK,& new_set,& old_set)”。它不会阻止信号。但是,如果我删除“pthread_create(& a,NULL,threadmasked,NULL);”其工作正常,并阻止信号。另外我在这里观察到的是,如果我更改pthread_sigmasksigprocmask行为保持不变。

回答

2

线程从它们创建的线程继承信号掩码。

因此,当您的代码在之后调用pthread_sigmask()时,它会调用pthread_create()新创建的线程未修改其信号掩码。

更改您的代码像这样,就使你想到事情的工作:

... 

pthread_sigmask(SIG_BLOCK, &new_set, &old_set); 

pthread_t a; 
pthread_create(&a, NULL, threadmasked, NULL); 

... 
+0

谢谢你的建议...但我从主线程提高信号和我更新了“” pthread_sigmask“”所以为什么它不能够阻止信号和另一件事,如果我在线程函数中使用pthread_sigmask(SIG_BLOCK,&new_set,&old_set)ie.threadmasked其阻塞信号 –

+0

根据我了解pthread_sigmask更改调用线程的信号掩码,无论但是在这里它改变了Parent Thread的行为。 –

+1

通过报警引发的信号被发送到当前进程。它留给操作系统哪个线程来处理信号。由于您阻塞了主线程的信号,但没有明确创建信号,报警信号由后者处理。如果您应用我建议的更改,则警告信号不会很严重。 – alk