屏蔽某些信号对线程的影响

1,基本的概率和函数;  #include <signal.h>

  sigset_t:信号集及信号集操作函数:信号集被定义为一种数据类型
  typedef struct {
  unsigned long sig[_NSIG_WORDS];
  } sigset_t
  
  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
");

    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!!!

菜鸟,你落后!!!

原文地址:https://www.cnblogs.com/cyc2009/p/3973981.html