线程中的信号控制

对比

设置进程/线程屏蔽信号:sigprocmask/pthread_sigmask
等待指定进程/线程结束:waitpid/pthread_join
向指定进程/线程发送信号:kill/pthread_kill
线程特有的等待指定的信号发生:sigwait
gcc编译时需加参数:gcc test.c -lpthread

例子

sigset_t mask;
void err_quit(const char *str){
    perror(str);
    exit(1);
}
void * thr_fn(void *arg){
    int err,signo;
    for(;;){
        err=sigwait(&mask,&signo);
        if(err != 0)
            err_quit("sigwait error");
        switch (signo){
            case SIGINT:
                puts("interrupt");
                break;
            case SIGQUIT:
                puts("quit");
                pthread_exit(0);
            default:
                printf("unexpected signal %d
",signo);
                pthread_exit((void *)1);
        }
    }
}
int main(void){
    int err;
    sigset_t oldmask;
    pthread_t tid;
 
//main线程中屏蔽的信号, 刚好是tid线程中等待的信号
    sigemptyset(&mask);
    sigaddset(&mask,SIGINT);
    sigaddset(&mask,SIGQUIT);
    sigaddset(&mask,SIGUSR1);
    if((err=pthread_sigmask(SIG_BLOCK,&mask,&oldmask)) !=0)
        err_quit("pthread_sigmask error");
    err=pthread_create(&tid,NULL,thr_fn,0);
    if(err != 0)
        err_quit("pthread_sigqueue error");
 
//以下三行可注释倒, 在终端手动输入C-c, C-
    sleep(2);
    pthread_kill(tid,SIGINT);
    pthread_kill(tid,SIGQUIT);

    err=pthread_join(tid,NULL);
    if(err != 0)
        err_quit("pthread_join error");
    if(sigprocmask(SIG_SETMASK,&oldmask,NULL) <0)
        err_quit("sigprocmask error");
    puts("main over");
    return 0;
}
原文地址:https://www.cnblogs.com/cfans1993/p/5699270.html