线程中的信号控制
对比
设置进程/线程屏蔽信号: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\n",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;
}