信号处理设计模式
问题
如何编写信号安全的应用程序?
Linux 应用程序安全性讨论
场景一:不需要处理信号
- 应用程序实现单一功能,不需要关注信号
- 如:数据处理程序,文件加密程序,科学计算程序
场景二:需要处理信号
- 应用程序长时间运行,需要关注信号,并即使处理
- 如:服务端程序,上位机程序
场景一:不需要信号处理 (单一功能应用程序)

场景二:需要处理信号 (长时间运行的应用)
同步方案
- 通过标记同步处理信号,整个应用中只有一个执行流
异步方案
- 专用任务处理,应用中存在多个执行流 (多线程应用)
- 设置专用信号处理任务,其它任务忽略信号,专注功能实现
同步解决方案 (单任务)
信号处理逻辑与程序逻辑位于同一个上下文
- 即:信号处理函数和主函数不存在资源竞争关系
方案设计一
- 将任务分解为子任务(每个任务可对应一个函数)
- 信号递达时,信号处理函数中仅标记递达状态
- 子任务处理结束后,真正执行信号处理
同步方案示例一

存在的问题
由于给每个信号唯一的标记位置,因此,所有信号转变为不可靠信号;并且仅保留最近递达的信号信息

方案设计二
将任务分解为子任务 (每个任务可对应一个函数)
- 创建信号文件描述符,并阻塞所有信号 (可靠信号递达前位于内核队列中)
- 子任务处理结束后,通过 select 机制判断是否有信号需要处理
- true => 处理信号 false => 等待超时
关键系统函数
#include <sys/select.h>
#include <sys/signalfd.h>
int signalfd(int fd, const sigset_t* mask, int flag);
int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout);
使用 signalfd() 处理信号
先屏蔽所有信号 (无法递达进程),之后为屏蔽信号创建文件描述符;当时机成熟,通过 read() 系统调用读取未决信号 (主动接收信号)

使用 select() 监听文件描述符

使用 select() 处理信号

存在的问题
由于使用了 select 机制,即便没有信号需要处理,也需要等待 select 超时,任务实时性受到影响

异步解决方案 (多任务)
使用独立任务处理信号,程序逻辑在其他任务中执行
即:通过多线程分离信号处理与程序逻辑
- 主线程:专用于信号处理
- 其他线程:完成程序功能

多线程信号处理
信号的发送目标是进程,而不是某个特定的线程
发送给进程的信号仅递送给一个进程
内核从不会阻塞目标信号的线程中随机选择
每个线程拥有独立的信号屏蔽掩码
异步解决方案 (多任务)
主线程:对目标信号设置信号处理的方式
- 当信号递达进程时,只可能时主线程进行信号处理
其他线程:首先屏蔽所有可能的信号,之后执行任务代码
- 无法接收到信号,不具备信号处理能力
进程与线程
进程:应用程序的一次加载执行 (系统执行资源分配的基本单位)
线程:进程中的程序执行流
- 一个进程中可以存在多个线程 (至少存在一个线程)
- 每个线程执行不同的任务 (多个线程可并行执行)
- 同一个进程中的多个线程共享进程的系统资源
Linux 多线程 API 函数
头文件:#include<pthread.h>
线程创建函数:int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void* (*start_routine)(void*), void* arg);
- thread:pthread_t 变量的地址,用于返回线程标识
- attr:线程的属性,可设置为 NULL,即:使用默认属性
- start_routine:线程入口函数
- arg:线程入口函数参数
线程标识:
- pthread_t pthread_self(void);
- 获取当前线程的 ID 标识
线程等待:
- int pthread_join(pthread_t thread, void** retval);
- 等待目标线程执行结束
多线程编程示例

异步方案示例 -- 主线程

异步方案示例 -- 任务线程

信号设计模式小结
多数模式不需要处理信号,因此可直接屏蔽信号
需要处理信号的程序,重点考虑信号安全性问题
- 同步处理方案,通过设计让任务代码和信号处理代码交替执行
- 问题:信号处理是否及时?任务执行是否实时?
- 异步处理方案,任务代码与信号处理代码位于不同执行流
- 问题:将信号安全性问题转换为线程安全性问题
- 因此,程序本身是否能做到线程安全?
相关文章:
信号处理设计模式
问题 如何编写信号安全的应用程序? Linux 应用程序安全性讨论 场景一:不需要处理信号 应用程序实现单一功能,不需要关注信号 如:数据处理程序,文件加密程序,科学计算程序 场景二:需要处理信…...
Linux权限的基本理解
一:🚩Linux中的用户 1.1🥦用户的分类 🌟在Linux中用户可以被分为两种用户: 超级用户(root):可以在Linux系统中做各种事情而不被约束普通用户:只能做有限的事情被权限约束 在实际操作时超级用户的命令提示符为#,普通用户的命令提示符为$,可…...
AI人工智能大模型讲师叶梓《基于人工智能的内容生成(AIGC)理论与实践》培训提纲
【课程简介】 本课程介绍了chatGPT相关模型的具体案例实践,通过实操更好的掌握chatGPT的概念与应用场景,可以作为chatGPT领域学习者的入门到进阶级课程。 【课程时长】 1天(6小时/天) 【课程对象】 理工科本科及以上࿰…...
nat地址转换
原理 将内网地址转换成外网地址 方式 掌握动态NAT的配置方法 掌握Easy IP的配置方法 掌握NAT Server的配置方法 实验 r1 r2 是内网 ar1 ip地址 ip add ip地址 掩码 ip route-static 0.0.0.0 0 192.168.1.254 默认网关 吓一跳网关 相等于设置了网关 ar2 …...
第12课 循环综合举例
文章目录 前言一、循环综合举例1. 质数判断问题2. 百人百砖问题3. 猴子吃桃问题4. 质因数分解问题5. 数字统计问题。 二、课后练习2. 末尾3位数问题3. 求自然常数e4. 数据统计问题5. 买苹果问题。6. 找5的倍数问题。 总结 前言 本课使用循环结构,介绍了以下问题的解…...
Tuxera NTFS for Mac2024免费Mac读写软件下载教程
在日常生活中,我们使用Mac时经常会遇到外部设备不能正常使用的情况,如:U盘、硬盘、软盘等等一系列存储设备,而这些设备的格式大多为NTFS,Mac系统对NTFS格式分区存在一定的兼容性问题,不能正常读写。 那么什…...
C++ 具名要求
此页面中列出的具名要求,是 C 标准的规范性文本中使用的具名要求,用于定义标准库的期待。 某些具名要求在 C20 中正在以概念语言特性进行形式化。在那之前,确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做…...
大创项目推荐 深度学习二维码识别
文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 🔥 优质竞赛项目系列,今天…...
C++初阶——基础知识(函数重载与引用)
目录 1.命名冲突 2.命名空间 3.缺省参数 4.函数重载 1.函数重载的特点包括: 2.函数重载的好处包括: 3.引用 引用的特点包括 引用的主要用途包括 引用和指针 引用 指针 类域 命名空间域 局部域 全局域 第一个关键字 命名冲突 同一个项目之间冲…...
车载电子电器架构 —— 电子电气系统开发角色定义
车载电子电器架构 —— 电子电气系统开发角色定义 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 注:本文12000字,深度思考者进!!! 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的…...
最新Redis7哨兵模式(保姆级教学)
一定一定要把云服务器的防火墙打开一定要!!!!!!!!!否则不成功!!!!!!!!&…...
Redis原理及常见问题
高性能之道 单线程模型基于内存操作epoll多路复用模型高效的数据存储结构redis的单线程指的是数据处理使用的单线程,实际上它主要包含 IO线程:处理网络消息收发主线程:处理数据读写操作,包括事务、Lua脚本等持久化线程:执行RDB或AOF时,使用持久化线程处理,避免主线程的阻…...
nvm 的安装及使用 (Node版本管理器)
目录 1、nvm 介绍 2、nvm安装 3、nvm 使用 4、node官网可以查看node和npm对应版本 5、nvm安装指定版本node 6、安装cli脚手架 1、nvm 介绍 NVM 全称 node.js version management ,专门针对 node 版本进行管理的工具,通过它可以安装和切换不同版本的…...
【Yii2】数据库查询方法总结
目录 1.查找单个记录: 2.查找多个记录: 3.条件查询: 4.关联查询: 假设User模型有一个名为orders的多对一关联关系。 5.排序和分组: 6.数据操作: 7.事务处理: 8.命令查询: 9…...
区块链的三难困境是什么,如何解决?
人们需要保持社交、工作和睡眠之间的平衡,并且努力和谐相处。同样的概念也反映在区块链的三难困境中。 区块链三难困境是一个术语,指的是现有区块链的局限性:可扩展性、安全性和去中心化。这是一个存在了几十年的设计问题,其问题的…...
oCPC实践录 | oCPM的秘密
前言 笔者从这几方面介绍oCPM,并一一分析平台侧宣称的oCPM相比oCPC的优势,并解开其中的秘密。 1)什么是oCPM? 2)oCPC与oCPM的异同 3)平台宣称oCPM的优势 4)oCPM真正的秘密 5)oCPM下的点击率与…...
【Linux Shell学习笔记】Linux Shell的位置参数与函数
一、位置参数 位置参数,也被称之为位置变量,通过位置参数,可以在执行程序的时候,向程序传递数据 1.1 shell接收参数的方法 1.2 向shell传递参数的方法 二、函数 2.1 函数基础 2.1.1 函数简介 函数本质上就是一个代码块…...
缓存cache和缓冲buffer的区别
近期被这两个词汇困扰了,感觉有本质的区别,搜了一些资料,整理如下 计算机内部的几个部分图如下 缓存(cache) https://baike.baidu.com/item/%E7%BC%93%E5%AD%98 提到缓存(cache),就…...
Vue常见面试问答
vue响应式数据 vue2 Vue2 的对象数据是通过 Object.defineProperty 对每个属性进行监听,当对属性进行读取的时候,就会触发 getter,对属性进行设置的时候,就会触发 setter。 /** * 这里的函数 defineReactive 用来对 Object.def…...
Eureka相关面试题及答案
1、什么是Eureka? Eureka是一个由Netflix开发的服务发现(Service Discovery)工具,它是Spring Cloud生态系统中的一个关键组件。服务发现是微服务架构中的一个重要概念,它允许服务实例在启动时注册自己,以便…...
MoMask终极指南:5分钟学会AI生成3D人体运动动画
MoMask终极指南:5分钟学会AI生成3D人体运动动画 【免费下载链接】momask-codes Official implementation of "MoMask: Generative Masked Modeling of 3D Human Motions (CVPR2024)" 项目地址: https://gitcode.com/gh_mirrors/mo/momask-codes 想…...
深入解析卷积层参数量与FLOPs的计算原理及优化策略
1. 卷积层参数量计算原理 要理解卷积层的参数量计算,我们先从一个实际例子入手。假设有个输入特征图尺寸是64643(HWC),卷积核大小33,输出通道数64,带偏置项。这时候参数量是多少呢? 参数量的构…...
Dark Reader实用指南:解决夜间浏览痛点的高效方案
Dark Reader实用指南:解决夜间浏览痛点的高效方案 【免费下载链接】darkreader Dark Reader Chrome and Firefox extension 项目地址: https://gitcode.com/gh_mirrors/da/darkreader 在数字时代,我们每天面对屏幕的时间越来越长,尤其…...
Spring Boot Helper插件免费版获取与版本适配全攻略
1. 为什么我们需要Spring Boot Helper插件 作为一个常年使用IntelliJ IDEA开发Spring Boot项目的程序员,我深刻体会到这个插件的重要性。简单来说,它就像是Spring Boot开发的"瑞士军刀",能帮我们快速创建项目、自动配置依赖、一键…...
提升code-server前端性能的终极指南:渐进式图片加载高级技巧
提升code-server前端性能的终极指南:渐进式图片加载高级技巧 【免费下载链接】code-server VS Code in the browser 项目地址: https://gitcode.com/GitHub_Trending/co/code-server code-server作为一款能在浏览器中运行的VS Code实现,让开发者可…...
通义千问3-Reranker-0.6B优化升级:调整批处理大小和自定义指令,性能再提升5%
通义千问3-Reranker-0.6B优化升级:调整批处理大小和自定义指令,性能再提升5% 1. 为什么需要优化重排序模型性能? 在信息检索和问答系统中,重排序模型扮演着至关重要的角色。它负责对初步检索得到的文档进行二次排序,…...
微信小程序人脸核身接入全攻略:从资质准备到代码实现(附避坑指南)
微信小程序人脸核身接入实战:合规指南与代码精要 在金融、政务等高安全要求的场景中,确保用户身份真实性已成为刚需。微信小程序提供的人脸核身能力,将活体检测、OCR识别与权威数据比对融为一体,为开发者提供了合规且高效的身份验…...
当孩子冲动行为影响学习,如何借助哈洛韦尔医生的情绪管理技巧?
如何有效应对孩子情绪管理困难,促进学习进步 面对孩子的情绪管理困难,家长和教育者可以采用一些实用的策略来帮助他们更好地表达情绪和应对挑战。首先,建立一个安全的环境非常重要,让孩子感到可以自由表达自己的情感而不必担心负面…...
用MATLAB从零实现六足机器人步态:交替三角与波动步态代码详解
用MATLAB从零实现六足机器人步态:交替三角与波动步态代码详解 六足机器人因其卓越的稳定性和地形适应能力,在野外勘探、灾难救援等领域展现出巨大潜力。而步态规划作为机器人运动控制的核心,直接决定了机器人的移动效率和稳定性。本文将带您从…...
比迪丽AI绘画创意开发:使用Matlab进行生成效果分析
比迪丽AI绘画创意开发:使用Matlab进行生成效果分析 1. 引言 在AI绘画创作领域,比迪丽模型因其出色的角色生成能力而备受关注。但如何科学评估生成效果、量化分析风格特征,一直是创作者面临的挑战。传统的人工评估方式主观性强、效率低下&am…...
