• linux 进程信号集合 sigset_t


    sigset_t
      号集及信号集操作函数:信号集被定义为一种数据类型:
      typedef struct {
      unsigned long sig[_NSIG_WORDS];
      } sigset_t
      信号集用来描述信号的集合,linux所支持的所有信号可以全部或部分的出现在信号集中,主要与信号阻塞相关函数配合使用。下面是为信号集操作定义的相关函数:
      int sigemptyset(sigset_t *set);
      int sigfillset(sigset_t *set);
      int sigaddset(sigset_t *set, int signum)
      int sigdelset(sigset_t *set, int signum);
      int sigismember(const sigset_t *set, int signum);
      头文件
      #include <signal.h>
      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指向的信号集中。

    pthread_sigmask

    POSIX 线程 – pthread_sigmask
    在多线程的程序里,希望只在主线程中处理信号,可以使用该函数。
     
    POSIX线程– pthread_sigmask
    在多线程的程序里,希望只在主线程中处理信号,可以使用
    函数:
    int pthread_sigmask (int how,const sigset_t *set,sigset_t *oset)

      用作在主调线程里控制信号掩码。
    How:
    SIG_BLOCK:结果集是当前集合参数集的并集;SIG_UNBLOCK:结果集是当前集合参数集的差集;SIG_SETMASK:结果集是由参数集指向的集
    头文件:<signal.h>
    错误:[EINVAL] how不是已定义值
      提示:除非信号在所有的线程里都阻塞,否则总能将异步信号传输给这个进程。
    解释:
    每个线程均有自己的信号屏蔽集(信号掩码),可以使用pthread_sigmask函数来屏蔽某个线程对某些信号的
    响应处理,仅留下需要处理该信号的线程来处理指定的信号。实现方式是:利用线程信号屏蔽集的继承关系
    (在主进程中对sigmask进行设置后,主进程创建出来的线程将继承主进程的掩码)
    static const int exceptsigs[] = {
        SIGCHLD, SIGIO, SIGURG, SIGWINCH,
        SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU, SIGCONT,
        -1,
    }; 
       sigset_t sigset;
        sigfillset(&sigset);
        for (i = 0; exceptsigs[i] != -1; i++)
        {
            sigdelset(&sigset, exceptsigs[i]);
        }
        pthread_sigmask(SIG_BLOCK, &sigset, NULL);
  • 相关阅读:
    linux 静态库和动态库(共享库)的制作与使用
    实现linux mkdir命令
    行间距和文本样式
    单位和字体
    html标签2
    css层叠样式表
    html标签
    html简介
    数据数组
    Redis的使用
  • 原文地址:https://www.cnblogs.com/yuguangyuan/p/10313296.html
Copyright © 2020-2023  润新知