日期:2014-05-16  浏览次数:20773 次

linux 线程处理信号疑问
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <error.h>
#include <signal.h>
void* fun1(void *arg)
{
int i = 0;
for(i = 0;i <10;i++)
{
printf("thread1 : i = %d\n",i);
sleep(1);
}
pthread_exit(NULL);
}

void* fun2(void *arg)
{
int r = 0;
int signo = 0;
sigset_t *pmask = (sigset_t *)arg;
while(sigwait(pmask,&signo) == 0)
{
switch(signo)
{
case SIGINT:
printf("recv SIGINT \n");
break;
case SIGQUIT:
printf("recv SIGQUIT \n");
pthread_exit(NULL);
break;
default:
printf("recv SIG %d \n",signo);
break;
}
}
pthread_exit(NULL);
}
int main(int argc,char *argv[])
{
sigset_t mask;
sigset_t oldmask;
pthread_t tid1,tid2;
int err = 0;
sigemptyset(&mask);
sigaddset(&mask,SIGINT);
sigaddset(&mask,SIGQUIT);
if((err = pthread_sigmask(SIG_BLOCK,&mask,&oldmask)) != 0)
{
printf("set sigmask %s\n",strerror(err));
return 1;
}

if ((err = pthread_create(&tid1,NULL,fun1,&mask)) != 0)
{
printf("create thread %s\n",strerror(err));
return 1;
}
if ((err = pthread_create(&tid2,NULL,fun2,&mask)) != 0)
{
printf("create thread %s\n",strerror(err));
return 1;
}

pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
if(sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0)
{
printf("sigprocmask error\n");
return 1;
}
return 0;
}

---------------------------------------------------------------------------------------------------------------------------------------------
昨天看了《unix高级环境编程》,里面上面个例子。有一个疑问:
pthread_sigmask是在线程中阻塞信号,sigprocmask是在进程中阻塞信号。为什么他们两个能同时出现在主线程(或进程)?难道是主线程就是进程吗?
------解决方案--------------------
sigprocmask是针对整个进程,pthread_sigmask只作用于本线程
主线程是一个线程,在主线程中pthread_sigmask只影响到自己,sigprocmask会影响到所有线程
程序刚开启动时只有一个线程即主线程,然后由主线程产生其他线程