1、信号掩码——被阻塞的信号集

每个进程都有一个用来描述哪些信号传送来将被阻塞的信号集,如果某种信号在某个进程的阻塞信号集中,则传送到该进程的此种信号将会被阻塞。当前被进程阻塞的信号集也叫信号掩码,类型为sigset_t。每个进程都有自己的信号掩码,且创建子进程时,子进程会继承父进程的信号掩码。

2、信号阻塞和忽略的区别

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

每个进程都有一个信号掩码,信号掩码是一个“位图”,如果位图中某位标识1,表示该位对应的信号被暂时屏蔽。如果标识为0,表示进程可以接收这个信号。

System V signal API信号处理函数除了sigset外,还有以下几个。

sighold()函数

把指定的信号增加到信号掩码中去(将位图中对应的位标识为1),这样就暂时屏蔽了该信号。

返回值:成功返回0,失败返回-1。

sigrelse()函数

从信号掩码中移除指定的信号,这样进程就可以接收该信号了。

返回值:成功返回0,失败返回-1。

sigignore()函数

将信号配置为SIG_IGN,即忽略该信号。

返回值:成功返回0,失败返回-1。

sigignore(SIGALRM)相当于sigset(SIGALRM, SIG_IGN)

使用方法:

当程序里有一部分代码执行时不想被某个信号中断,可以使用sighold函数和sigrelse函数,临时屏蔽和恢复某个信号。

例子程序:test9.c

#include

#include

void AlarmHandle()

{

printf("AlarmHandle\n");

}

int main(void)

{

int i;

sigset(SIGALRM, AlarmHandle);//注册信号处理函数

alarm(5);//设置闹钟函数5秒发送SIGALRM信号

sighold(SIGALRM);//暂时屏蔽信号

for (i = 0; i < 10; i++)

{

printf("i=%d\n", i);

sleep(1);

}

sigrelse(SIGALRM);//从信号掩码中移除信号

printf("3333\n");

return 0;

}

执行结果:

[root@server ~]# ./test9

i=0

i=1

i=2

i=3

i=4

i=5

i=6

i=7

i=8

i=9

AlarmHandle

3333

程序先设置闹钟函数,时间是5秒,在执行for循环前暂时屏蔽了SIGALRM信号,使for循环不会被中断。因为在for执行过程中,alarm时间已到,系统发送的信号SIGALRM被阻塞。for循环结束后恢复响应信号,系统发送信号,就先执行了信号处理函数,打印AlarmHandle,然后打印3333,程序结束。

linux任务处理函数,Linux信号掩码和信号处理函数相关推荐

  1. Linux 多线程应用中编写安全的信号处理函数

    2019独角兽企业重金招聘Python工程师标准>>> Linux 多线程应用中编写安全的信号处理函数 在 开发多线程应用时,开发人员一般都会考虑线程安全,会使用 pthread_m ...

  2. 信号集操作函数,信号未决、阻塞、递达

    转载:信号集操作函数,信号阻塞与未决 一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } si ...

  3. 信号集操作函数,信号阻塞与未决

    一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...

  4. 1.3 信号处理函数,创建worker进程

    文章目录 1.信号处理函数 2.创建worker线程 3.sigsuspend函数说明 4.write函数思考 1.信号处理函数 1.初始化信号的函数,用于注册信号处理程序 2.信号处理函数 初始化信 ...

  5. Linux信号 二 信号处理函数注册

    每一个信号都有一个信号处理函数,可以是SIG_IGN, SIG_DFL或者是用户自定义的处理函数.使用用户自定义的处理函数需要注册,注册接口有如下两种. 第一种是signal调用 #include & ...

  6. linux 系统对信号的处理,Linux下的信号处理函数总结

    1.信号处理函数 相关函数原型如下: #include sighandler_t signal(int signum, sighandler_t handler); 第一参数是信号 第二个参数是信号处 ...

  7. Linux 多线程应用中如何编写安全的信号处理函数

    Linux 多线程应用中编写安全的信号处理函数 在开发多线程应用时,开发人员一般都会考虑线程安全,会使用 pthread_mutex 去保护全局变量.如果应用中使用了信号,而且信号的产生不是因为程序运 ...

  8. 【B站视频笔记】linux 进程间通信(ipc)信号(软中断信号)signal库函数、可靠信号和不可靠信号、信号集sigprocmask(信号掩码、信号递达Delivery、信号未决Pending)

    [视频教程]Linux信号详解(可靠信号.不可靠信号.阻塞信号.信号处理函数) [博文]Linux信号 文章目录 背景 课程笔记 一.如何让程序在后台运行 1.加"&"符号 ...

  9. linux下sig_pipe函数,linux socket编程 出现信号SIGPIPE,分析及解决

    在编写一个仿QQ软件,C/S模式.出现的问题:当客户机关闭时,服务器也随着关闭,纠结很久之后,我gdb了下,出现下面提示信息: Program received signal SIGPIPE, Bro ...

最新文章

  1. 区分各浏览器的CSS hack(包括360、搜狗、opera)
  2. java 8 集合分组_Java 8:按集合分组
  3. python 中移去文件的只读属性
  4. java类内部的变量
  5. catkin_make
  6. 2016年百度面试题
  7. 求数组中各个元素的个数?
  8. java executor解读_Java-多线程框架Executor解读
  9. Men and women can't be 'just friends
  10. ionic3 图片(轮播)预览 ionic-gallary-modal组件使用方法
  11. Web.py session用户认证
  12. C语言闰年还是平年问题程序,c语言判断一年是不是闰年,编程错在哪呢?
  13. 沈向洋:为何读论文这么难?
  14. ARM TrustZone技术简介
  15. 从秋招看名堂,哪些大厂值得程序员去?
  16. 中职学校计算机教学探讨,中职学校计算机课程教学方法的探讨.doc
  17. D. Deleting Divisors
  18. 明年9月,南京大学苏州校区将正式招生!
  19. RK3568平台开发系列讲解(电源管理篇)RK809 电源管理芯片配置
  20. x86跑android,ARM跑Win,X86跑安卓,为什么两种架构互相“踢馆”?

热门文章

  1. 遇见未来系列专访 | 聆听时代最前沿的声音
  2. 面对锁等待难题,数仓如何实现问题的秒级定位和分析
  3. MySQL事务处理特性的实现原理
  4. 一起来学习LiteOS中断模块的源代码
  5. 从零开始:什么是Makefile分析
  6. TA能让你家的那些“哑”终端都“活”过来
  7. 【华为云技术分享】【我的物联网成长记20】物联网智慧路灯应用代码解析(下)
  8. zz:NETCONF协议详解
  9. hbuild 编译 php,Hbuilder的PHP环境搭建
  10. LeetCode-76: 最小覆盖子串