屏蔽某些信号对线程的影响
1,基本的概率和函数; #include <signal.h>
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!!!
菜鸟,你落后!!!
posted on 2014-09-16 09:16 tiger_chen 阅读(678) 评论(0) 编辑 收藏 举报