2013-01-24 82 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