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_sigmask到sigprocmask行爲保持不變。
謝謝你的建議...但我從主線程提高信號和我更新了「」 pthread_sigmask「」所以爲什麼它不能夠阻止信號和另一件事,如果我在線程函數中使用pthread_sigmask(SIG_BLOCK,&new_set,&old_set)ie.threadmasked其阻塞信號 –
根據我瞭解pthread_sigmask更改調用線程的信號掩碼,無論但是在這裏它改變了Parent Thread的行爲。 –
通過報警引發的信號被髮送到當前進程。它留給操作系統哪個線程來處理信號。由於您阻塞了主線程的信號,但沒有明確創建信號,報警信號由後者處理。如果您應用我建議的更改,則警告信號不會很嚴重。 – alk