• sigprocmask阻塞信号


    有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数

    1. 信号阻塞和忽略信号的区别
    操作系统在信号被进程解除阻塞之前不会将信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递。当进程忽略一个信号时,信号会被传递出去但进程会将信号丢弃

    2. sigprocmask

    int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

    改变进程的当前阻塞信号集,也可以用来检测当前进程的信号掩码

    how:

    • SIG_BLOCK:将set所指向的信号集中所包含的信号加到当前的信号掩码中,作为新的信号屏蔽字
    • SIG_UNBLOCK:将参数set所指向的信号集中的信号从当前的信号掩码中移除
    • SIG_SETMASK:设置当前信号掩码为参数set所指向的信号集中所包含的信号

    oldset:不是NULL指针,那么目前的信号屏蔽字会由此指针返回

    注:sigprocmask()函数只为单线程的进程定义的,在多线程中要使用pthread_sigmask变量,在使用之前需要声明和初始化

    3. 设置方法
    SIG_BLOCK,SIG_UNBLOCK成对实现。可以不用关心oldset

    4. 示例

    sigemptyset(&set); //初始化信号量集  
    sigaddset(&set,SIGTSTP); //将SIGTSTP添加到信号量集中  
    sigaddset(&set,SIGINT);//将SIGINT添加到信号量集中  
    sigprocmask(SIG_SETMASK,&set,&oldset); //将set中的SIGINT,SIGTSTP阻塞掉,并保存当前信号屏蔽字  
  • 相关阅读:
    1113. Integer Set Partition (25)
    1110. Complete Binary Tree (25)
    1109. Group Photo (25)
    Bender Problem
    格子中输出
    牌型种数
    移动距离
    QQ帐户的申请与登陆(25 分)
    词频统计
    基于HTTP的直播点播HLS
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709928.html
Copyright © 2020-2023  润新知