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