2019独角兽企业重金招聘Python工程师标准>>>

man sigprocmask:

NAMEsigprocmask - examine and change blocked signalsSYNOPSIS#include <signal.h>int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);Feature Test Macro Requirements for glibc (see feature_test_macros(7)):sigprocmask(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCEDESCRIPTIONsigprocmask()  is used to fetch and/or change the signal mask of the calling thread.  The signal mask is the set of signals whose delivery is currently blocked forthe caller (see also signal(7) for more details).The behavior of the call is dependent on the value of how, as follows.SIG_BLOCKThe set of blocked signals is the union of the current set and the set argument.SIG_UNBLOCKThe signals in set are removed from the current set of blocked signals.  It is permissible to attempt to unblock a signal which is not blocked.SIG_SETMASKThe set of blocked signals is set to the argument set.If oldset is non-null, the previous value of the signal mask is stored in oldset.If set is NULL, then the signal mask is unchanged (i.e., how is ignored), but the current value of the signal mask is nevertheless returned in oldset (if it is notNULL).The use of sigprocmask() is unspecified in a multithreaded process; see pthread_sigmask(3).RETURN VALUEsigprocmask() returns 0 on success and -1 on error.ERRORSEINVAL The value specified in how was invalid.CONFORMING TOPOSIX.1-2001.NOTESIt is not possible to block SIGKILL or SIGSTOP.  Attempts to do so are silently ignored.Each of the threads in a process has its own signal mask.A child created via fork(2) inherits a copy of its parent’s signal mask; the signal mask is preserved across execve(2).If  SIGBUS,  SIGFPE, SIGILL, or SIGSEGV are generated while they are blocked, the result is undefined, unless the signal was generated by the kill(2), sigqueue(2),or raise(3).See sigsetops(3) for details on manipulating signal sets.SEE ALSOkill(2), pause(2), sigaction(2), signal(2), sigpending(2), sigqueue(2), sigsuspend(2), pthread_sigmask(3), sigsetops(3), signal(7)COLOPHONThis page is part of release 3.22 of the Linux man-pages project.  A  description  of  the  project,  and  information  about  reporting  bugs,  can  be  found  athttp://www.kernel.org/doc/man-pages/.Linux                             2008-10-17                    SIGPROCMASK(2)

sigprocmask设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)。

参数:

how:用于指定信号修改的方式,可能选择有三种

SIG_BLOCK//将set所指向的信号集中包含的信号加到当前的信号掩码中。即信号掩码和set信号集进行或操作。

SIG_UNBLOCK//将set所指向的信号集中包含的信号从当前的信号掩码中删除。即信号掩码和set进行与操作。

SIG_SETMASK //将set的值设定为新的进程信号掩码。即set对信号掩码进行了赋值操作。

set:为指向信号集的指针,在此专指新设的信号集,如果仅想读取现在的屏蔽值,可将其置为NULL。

oldset:也是指向信号集的指针,在此存放原来的信号集。可用来检测信号掩码中存在什么信号。

返回说明:

成功执行时,返回0。失败返回-1,errno被设为EINVAL。

sigprocmask示例(演示添加信号掩码):

代码示例:

#include <stdio.h>
#include <signal.h>
void checkset(int i);    void main()
{sigset_t blockset;    sigemptyset(&blockset);    sigaddset(&blockset,SIGINT);    sigaddset(&blockset,SIGTSTP);    if(sigismember(&blockset,SIGINT))    printf("sig int in main\n");    checkset(0);    sigprocmask(SIG_SETMASK,&blockset,NULL);    if(sigismember(&blockset,SIGINT))    printf("sig int in main\n");    checkset(1);    sigaddset(&blockset,SIGTERM);    sigprocmask(SIG_BLOCK,&blockset,NULL);    checkset(2);    //sigdelset(&blockset,SIGTERM);     sigprocmask(SIG_UNBLOCK,&blockset,NULL);    if(sigismember(&blockset,SIGTERM))    printf("sig term in main\n");    if(sigismember(&blockset,SIGINT))    printf("sig int in main\n");    if(sigismember(&blockset,SIGTSTP))    printf("sig tstp in main\n");    checkset(3);if(sigismember(&blockset,SIGTERM))    printf("sig term in main\n");    if(sigismember(&blockset,SIGINT))    printf("sig int in main\n");    if(sigismember(&blockset,SIGTSTP))    printf("sig tstp in main\n");
}void checkset(int i)
{sigset_t set;printf("check set start:%d\n", i);if(sigprocmask(SIG_BLOCK,NULL,&set)<0){printf("check set sig procmask error!!\n");exit(0);}if(sigismember(&set,SIGINT))printf("sig int\n");if(sigismember(&set,SIGTSTP))printf("sig tstp\n");if(sigismember(&set,SIGTERM))printf("sig term\n");printf("check set end\n\n");
}

运行结果:

sig int in main
check set start:0
check set endsig int in main
check set start:1
sig int
sig tstp
check set endcheck set start:2
sig int
sig tstp
sig term
check set endsig term in main
sig int in main
sig tstp in main
check set start:3
check set endsig term in main
sig int in main
sig tstp in main

sigdelset()位于sigprocmask()之前的效果:

#include <stdio.h>
#include <signal.h>
void checkset(int i);    void main()
{sigset_t blockset;    sigemptyset(&blockset);    sigaddset(&blockset,SIGINT);    sigaddset(&blockset,SIGTSTP);    if(sigismember(&blockset,SIGINT))    printf("sig int in main\n");    checkset(0);    sigprocmask(SIG_SETMASK,&blockset,NULL);    if(sigismember(&blockset,SIGINT))    printf("sig int in main\n");    checkset(1);    sigaddset(&blockset,SIGTERM);    sigprocmask(SIG_BLOCK,&blockset,NULL);    checkset(2);    sigdelset(&blockset,SIGTERM);     sigprocmask(SIG_UNBLOCK,&blockset,NULL);    if(sigismember(&blockset,SIGTERM))    printf("sig term in main\n");    if(sigismember(&blockset,SIGINT))    printf("sig int in main\n");    if(sigismember(&blockset,SIGTSTP))    printf("sig tstp in main\n");    checkset(3);if(sigismember(&blockset,SIGTERM))    printf("sig term in main\n");    if(sigismember(&blockset,SIGINT))    printf("sig int in main\n");    if(sigismember(&blockset,SIGTSTP))    printf("sig tstp in main\n");
}void checkset(int i)
{sigset_t set;printf("check set start:%d\n", i);if(sigprocmask(SIG_BLOCK,NULL,&set)<0){printf("check set sig procmask error!!\n");exit(0);}if(sigismember(&set,SIGINT))printf("sig int\n");if(sigismember(&set,SIGTSTP))printf("sig tstp\n");if(sigismember(&set,SIGTERM))printf("sig term\n");printf("check set end\n\n");
}

运行结果:

sig int in main
check set start:0
check set endsig int in main
check set start:1
sig int
sig tstp
check set endcheck set start:2
sig int
sig tstp
sig term
check set endsig int in main
sig tstp in main
check set start:3
sig term
check set endsig int in main
sig tstp in main

当 sigdelset(&blockset,SIGTERM);     位于     sigprocmask(SIG_UNBLOCK,&blockset,NULL);之前,那么从打印信息看,if(sigismember(&blockset,SIGTERM))的条件为false,但是if(sigprocmask(SIG_BLOCK,NULL,&set)<0)的set有值。

转载于:https://my.oschina.net/u/2326611/blog/845781

linux sigprocmask函数理解相关推荐

  1. linux fork函数的精辟解说

    此文原文来源于一个blog,文章的名称为:linux fork函数的精辟解说原文地址:http://blog.chinaunix.net/space.php?uid=12461657&do=b ...

  2. Linux内核深入理解定时器和时间管理(1):硬件时钟和jiffies

    Linux内核深入理解定时器和时间管理 硬件时钟和jiffies rtoax 2021年3月 在原文基础上,增加5.10.13内核源码相关内容. 全局部变量 --------------------- ...

  3. Linux内核深入理解系统调用(3):open 系统调用实现以及资源限制(setrlimit/getrlimit/prlimit)

    Linux内核深入理解系统调用(3) open 系统调用实现以及资源限制(setrlimit/getrlimit/prlimit) rtoax 2021年3月 对原文进行了5.10.13的代码分析. ...

  4. Linux内核深入理解系统调用(2):vsyscall 和 vDSO 以及程序是如何运行的(execve)

    Linux内核深入理解系统调用(2) vsyscall 和 vDSO 以及程序是如何运行的(execve) rtoax 2021年3月 1. vsyscalls 和 vDSO 这是讲解 Linux 内 ...

  5. Linux内核深入理解系统调用(1):初始化-入口-处理-退出

    Linux内核深入理解系统调用(1):初始化-入口-处理-退出 rtoax 2021年3月 1. Linux 内核系统调用简介 这次提交为 linux内核解密 添加一个新的章节,从标题就可以知道, 这 ...

  6. Linux内核深入理解中断和异常(8):串口驱动程序

    Linux内核深入理解中断和异常(8):串口驱动程序 rtoax 2021年3月 /*** start_kernel()->setup_arch()->idt_setup_early_tr ...

  7. Linux内核深入理解中断和异常(5):外部中断

    Linux内核深入理解中断和异常(5):外部中断 rtoax 2021年3月 1. 外部中断简介 外部中断包括:键盘,鼠标,打印机等. 外部中断包括: I/O interrupts; IO中断 Tim ...

  8. Linux内核深入理解中断和异常(3):异常处理的实现(X86_TRAP_xx)

    Linux内核深入理解中断和异常(3):异常处理的实现(X86_TRAP_xx) rtoax 2021年3月 /*** start_kernel()->setup_arch()->idt_ ...

  9. Linux内核深入理解中断和异常(2):初步中断处理-中断加载

    Linux内核深入理解中断和异常(2):初步中断处理-中断加载 rtoax 2021年3月 1. 总体概览 关于idt_table结构的填充,在5.10.13中流程为: idt_setup_early ...

最新文章

  1. LeetCode实战:数组中的第K个最大元素
  2. scikit learning curve学习曲线绘制
  3. 人脸识别再遭弃用,美国之后这回轮到欧盟
  4. 欧阳自远:有个性的嫦娥12345,如何不重复美国探月路?
  5. 【alibaba-cloud】nacos安装
  6. 【PM模块】操作功能概览
  7. VTK:隐式函数之SampleFunction
  8. iOS Hacker Keychain相关The executable was signed with invalid entitlements
  9. 研究生举报导师强迫学生延期毕业,事件再三反转,学校回应:开展调查
  10. 软件设计师--文件索引
  11. Moss/Sharepoint:自定义 Oracle Membership
  12. 剑指offer——10.斐波那契数列
  13. Java编程:分治算法
  14. 为什么会有Memlink? redis
  15. zabbix监控nginx的状态
  16. Java泛型类继承实现
  17. 2022-CKA考试经验总结
  18. 2012年8月编程语言就业趋势
  19. 竞赛 | 中国健康信息处理大会(CHIP2022)发布评测任务
  20. 从隐函数存在定理到隐函数定理

热门文章

  1. Git如何生成多个ssh key添加到ssh-agent管理项目
  2. 测试博客园代码插入格式显示
  3. 2017-2018-2 20155203《网络对抗技术》 Exp7:网络欺诈防范
  4. Centos7上openVP的另一种使用方式,实现访问控制!
  5. 新IT运维模式下,全栈溯源助你解应用性能监控难题
  6. 《编程原本 》一2.2 轨道
  7. php抽奖概率算法(刮刮卡,大转盘)
  8. 关于IKAnalyzer自定义分词的切换主词典的方法
  9. Asp.Net服务器控件开发的Grid实现(三)列编辑器
  10. RabbitMQ 整合 Spring AMQP 实战