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会影响到所有线程
程序刚开启动时只有一个线程即主线程,然后由主线程产生其他线程