sigemptyset(sigset_t *set)初始化由set指定的信号集,信号集里面的所有信号被清空;
sigfillset(sigset_t *set)调用该函数后,set指向的信号集中将包含linux支持的64种信号;
sigaddset(sigset_t *set, int signum)在set指向的信号集中加入signum信号;
sigdelset(sigset_t *set, int signum)在set指向的信号集中删除signum信号;
sigismember(const sigset_t *set, int signum)判定信号signum是否在set指向的信号集中。
int sigaction( int sig, const struct sigaction *act,struct sigaction *oact )检查、修改和指定信号相关联的信号响应。
2,直接上代码,分析是如何屏蔽信号的影响

int main(int argc, char *argv[])
{
int err, nargc, i, ret = 0;
pthread_t sigtid;
int ret_thr;
char c;
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGINT);
pthread_sigmask(SIG_BLOCK, &sigset, NULL);
sleep(10);
//pthread_create(&sigtid, NULL, (void *)&sighand, NULL);
printf("hello world\n");
return 0;
}

sigemptyset(&sigset)--》清空sigset这个信号集;
sigaddset(&sigset,SIGINT);将SIGINT添加到sigset这个信号集当中。(暂时找不到原码,不知道如何添加到信号集)
pthread_sigmask(SIG_BLOCK, &sigset, NULL) 每个线程均有自己的信号屏蔽集(信号掩码),可以使用pthread_sigmask函数来屏蔽某个线程对某些信号的响应处理,仅留下需要处理该信号的线程来处理指定的信号。实现方式是:利用线程信号屏蔽集的继承关系(在主进程中对sigmask进行设置后,主进程创建出来的线程将继承主进程的掩码)。
SIG_BLOCK: 结果集是当前集合参数集的并集SIG_UNBLOCK: 结果集是当前集合参数集的差集SIG_SETMASK: 结果集是由参数集指向的集
分析例子:(Ctrl+c发送SIG_INT信号。)
先清空了信号集,然后添加了SIG_INT信号进去,并pthread_sigmask中使用SIG_BLOCK并集所有信号进行屏蔽,当然这里只有SIG_INT信号。执行程序,在sleep(10)期间,键盘上输入ctrl+c,进程根本不会停下来,直到sleep(10)过后,打印出hello world。由于主线程设置sigmask的继承性,创建出来的线程同样对SIG_INT屏蔽,比如上例中pthread_create(&sigtid, NULL, (void *)&sighand, NULL);sighand线程处理,依旧会屏蔽SIG_INT的处理。
OK,这就是最最基本的东西。当然,对线程的信号处理,还是有很多操作,还有很多要学习!fighting!!!
菜鸟,你落后!!!