线程中的信号处理
在多线程中,所有的信号屏蔽字的处理都是共享的,每一个线程对信号屏蔽字的处理,会影响其他线程对这个屏蔽字的处理。
多线程中使用pthread_sigmask()函数设置信号屏蔽字。其中sigwait(sigset_t* set,int* signo)可以阻塞线程,使用此函数前,需要阻塞信号集中的信号,函数只做两件事情:第一,监听被阻塞的信号;第二,如果所监听的信号产生了,则将其从未决队列中移出来。这个函数可以用于:1)使用一个线程等待处理专门的信号,比如中断信号 2)可以再主线程中屏蔽多个信号,然后每个线程使用此函数,等待相应的信号,从而唤醒线程的,达到线程同步运行。
pthread_mutex_t mutex; pthread_cond_t cond; pthread_mutex_init(&mutex,null); pthread_cond_init(&mutex,null); int quitflag; void thread(void* data) { int err; sigset_t mask; sigemptyset(&mask); sigaddset(&mask,SIGINT); err=sigaddset(&mask,SIGQUIT); if(err!=0) printf("sigwait failed"); sigwait(&mask,&signo) switch(signo) { case SIGINT: { printf("") break; } case SIGQUIT: { pthread_mutex_block(&mutex); quitflag=1; pthread_mutex_unblock(&mutex); pthread_cond_signal(cond); return 0; } default: exit(1); } } int main() { sigset_t set,oldset; pthread_t tid; sigemptyset(&set); sigaddset(&set,SIGINT); sigaddset(&set,SIGQUIT); pthread_sigmask(SIG_BLOCK,&set,&oldset); pthread_creat(&tid,NULL,thread,0); pthread_mutex_block(&mutex); while(quitflag==0) pthread_cond_wait(&cond,&mutex); pthread_mutex_block(&mutex); quitflag=0; pthread_sigmask(SIG_SETMASK,&oldmask,NULL); exit(0); }
浙公网安备 33010602011771号