zoukankan      html  css  js  c++  java
  • 屏蔽某些信号对线程的影响

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

    菜鸟,你落后!!!

  • 相关阅读:
    阿里云公网IP不能使用
    Python2 socket TCPServer 多线程并发 超时关闭
    Python2 socket 多线程并发 ThreadingTCPServer Demo
    Python2 socket 多线程并发 TCPServer Demo
    Python socket TCPServer Demo
    Python socket server demo
    jsp注释方式
    面试小结(java基础)
    java 多线程sleep和wait的区别
    Java中Runnable和Thread的区别
  • 原文地址:https://www.cnblogs.com/cyc2009/p/3973981.html
Copyright © 2011-2022 走看看