线程中的信号处理

在多线程中,所有的信号屏蔽字的处理都是共享的,每一个线程对信号屏蔽字的处理,会影响其他线程对这个屏蔽字的处理。

多线程中使用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);
}

 

posted on 2015-08-18 16:28  菜鸟基地  阅读(493)  评论(0)    收藏  举报

导航