当前位置: 首页 > news >正文

linux信号处理响应异步事件,Linux并发(异步信号)

0818b9ca8b590ca3270a3433284dd417.png

Linux下的信号是诸多进程间通信(IPC)中唯一一种异步通信方式,这决定了信号的处理跟其他的IPC有本质差别。

拓展:

一般情况下,进程什么时候会收到信号、收到什么信号是无法事先预料的(除了某几个特殊的信号之外),信号的到来就像你家门铃的响起一样,你不知道他什么时候会响。

下图展示了内核中跟信号相关的最重要的数据组织关系:

0818b9ca8b590ca3270a3433284dd417.png

对这幅图的理解提几点重要说明:

1,每一个线程都使用一个PCB(即task_struct)来表示,因此pending(不是指针)就是一个线程单独私有的,当我们使用pthread_kill( )给一个指定的线程发送某信号时,这些信号将会被存储在这个链队列中。

2,signal是一个指向线程共享的信号挂起队列相关结构体的指针,实际上,一个线程组(即一个进程)中的所有线程中的signal指针都指向同一个结构体,当我们使用诸如kill( )来给一个进程发送某信号的时候,这些信号将会被存储在shared_pending这个线程共享的链队列中。

如果一个进程中有超过1条线程,那么这些共享的挂起信号将会被随机的某条线程响应,为了能确保让一个指定的线程响应来自进程之外的、发送给整个进程的某信号,一般的做法如下:

除了指定要响应某信号的线程外,其他线程对这些信号设置阻塞。即使用sigprocmask( )或者pthread_sigmask( )将这些需要阻塞的信号添加到信号阻塞掩码blocked当中。

3,sighand也是一个指针,因此也是进程中的所有线程共享的,他指向跟信号响应函数相关的数据结构,结构体struct sighand_struct{}中的数组action有64个元素,一一对应LINUX系统支持的64个信号(其中0号信号是测试用的,32号和33号信号保留),每一个元素是一个sigaction{}结构体,其成员就是标准C库函数sigaction( )中的第二个参数的成员,可见,该函数相当于是一个应用层给内核设置信号响应策略的窗口。

另外,在编写信号响应函数时也应非常慎重地访问进程的共享数据,必要时要加锁来保护。响应函数跟进程的其他部分函数微观上虽然是串行执行的关系,但由于信号触发点的异步特性,就使得信号响应函数的执行跟进程的其他部分函数在宏观上是并行执行关系,请看图解:

0818b9ca8b590ca3270a3433284dd417.png

可以看到,由于信号触发点可以发生在进程执行过程中的任意时刻,因此响应函数f( )事实上就是跟主进程并发的,在响应函数内部访问任何共享资源,都必须跟多线程一样,使用同步互斥机制来确保访问的安全性。

相关文章:

  • redis 3.0.0 linux下载,Redis可视化管理软件RedisPlus 3.0.0下载,优化了性能及交互体验...
  • c语言阶乘 ii多测试,C语言经典题目:求阶乘n!=n*(n-1)*...*1,阶乘和s=1!+(2)!+(3)!+...+n!...
  • 利用c语言实现几何图形旋转,[平顶山学院高等数学C语言试题.doc
  • linux子系统adb,[ubuntu] win10中linux子系统增加adb调试功能
  • android 媒体按钮,如何使用新的MediaSession类在Android 5.x上接收媒体按钮?
  • android按钮图,android-UI组件实例大全(三)------按钮Button与图片按钮ImageButton
  • android jmdns,jmdns.jar 通信
  • 锁定当前屏幕触摸android,Android解锁屏幕,然后重新锁定屏幕(Nook简单触摸)
  • 华为鸿蒙os2.0版适用机型,鸿蒙os2.0支持机型_华为鸿蒙os2.0系统支持什么手机
  • android画笔大小,android之画板功能之橡皮擦 画笔大小和画笔颜色
  • dll文件可以在Android上用吗,在Android应用程序中使用dll文件
  • html给看板娘添加语音,如何在网页上插入一个看板娘
  • Android调用美图皮肤接口,首创皮肤识别 美图秀秀android新版上线
  • 没有什么效果的html标签,h1fontcolor=red为什么像这样的标签输入没有效果呢.。。。/font/h1_html/css_WEB-ITnose...
  • 计算机网络范围覆盖类别,计算机网络如何分类和计算机网络的类别
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 2017 前端面试准备 - 收藏集 - 掘金
  • FineReport中如何实现自动滚屏效果
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Js基础知识(四) - js运行原理与机制
  • JS专题之继承
  • LeetCode29.两数相除 JavaScript
  • MobX
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Python_OOP
  • spark本地环境的搭建到运行第一个spark程序
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 算法---两个栈实现一个队列
  • 学习Vue.js的五个小例子
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • #QT(智能家居界面-界面切换)
  • (06)金属布线——为半导体注入生命的连接
  • (arch)linux 转换文件编码格式
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (学习日记)2024.01.19
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .chm格式文件如何阅读
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • /etc/motd and /etc/issue
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [1] 平面(Plane)图形的生成算法
  • [2018-01-08] Python强化周的第一天
  • [autojs]autojs开关按钮的简单使用
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [go] 迭代器模式
  • [HTML API]HTMLCollection