信号处理设计模式

news2024/11/20 2:38:05

问题

如何编写信号安全的应用程序?

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);
  • 等待目标线程执行结束

多线程编程示例

异步方案示例 -- 主线程

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

信号设计模式小结

多数模式不需要处理信号,因此可直接屏蔽信号

需要处理信号的程序,重点考虑信号安全性问题

  • 同步处理方案,通过设计让任务代码和信号处理代码交替执行
    • 问题:信号处理是否及时?任务执行是否实时?
  • 异步处理方案,任务代码与信号处理代码位于不同执行流
    • 问题:将信号安全性问题转换为线程安全性问题
    • 因此,程序本身是否能做到线程安全?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xshell连接不上本地虚拟机中的linux处理

0、连接不上虚拟机的原因 1、本地电脑未启用VMware网络。 2、连接协议选择错误。 3、防火墙屏蔽IP。 4、虚拟机网络连接模式不是桥接模式。 1、查看本地是否启用VMware的网络 2、连接协议选择 我们在新建会话时&#xff0c;可选的协议有FTP和SFTP两种&#xff0c;其中FTP采用21…

uniapp 手持弹幕全端实现(微信/QQ小程序 + APP)

见下述效果图,本文话少纯干货 代码实现 <template><view class="main"

【RocketMQ笔记02】安装RocketMQ可视化工具rocketmq-dashboard

这篇文章&#xff0c;主要介绍如何安装RocketMQ可视化工具rocketmq-dashboard。 目录 一、RocketMQ可视化界面 1.1、下载rocketmq-dashboard 1.2、修改配置文件 1.3、打包工程 1.4、启动rocketmq-dashboard 一、RocketMQ可视化界面 1.1、下载rocketmq-dashboard rocketm…

NET中使用Identity+CodeFirst+Jwt实现登录、鉴权

目录 前言 一、创建上下文类 1.自定义MyContext上下文类继承IdentityDbContext 2.在Program中添加AddDbContext服务 二、使用Migration数据迁移 1.在控制台中 依次使用add-migration 、updatebase 命令 2.如何修改表名 3.如何自定义字段 三、使用Identity实现登录、修改密码 …

汽车零配件装配产线中使用RFID技术和不使用RFID技术的优缺点

汽车零配件装配产线中使用RFID技术和不使用RFID技术的优缺点 RFID(射频识别技术)是非接触式自动识别技术&#xff0c;经常被使用于工业制造、物流管理、仓储物品盘点等领域。我们聊一聊在汽车零配件装配产线中使用和不使用RFID技术的优缺点 在汽车零配件装配线使用RFID技术可以…

「GPT」G、P、T分别是啥意思?

G意为Generative &#xff1a;生成式 比如&#xff0c;生成式的分类器&#xff08;模型&#xff09;包括---- generative classifiers: naive Bayes classifier and linear discriminant analysis 与之对应的为判别式----- discriminative model: logistic regression P意为…

每日一题——LeetCode206.反转链表

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1示例2示例3提示 2. 思路3.代码 1. 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例1 输入&#xff1a;head [1…

讯飞星火认知大模型智能语音交互调用

随着国内外大模型热度的兴起&#xff0c;依托于大模型的智能化&#xff0c;传统的人机交互已经不能满足人们交互的需求。而结合语音和大模型的交互拜托传统互联网获取知识的文字限制&#xff0c;用语音也可以轻松获取想要的知识和思路。 一、大模型智能语音交互调用实现思路 …

nginx-proxy-manager初次登录502 bad gateway

nginx-proxy-manager初次登录502 bad gateway 按照官方docker-compose安装后,页面如下: 默认账户密码: adminexample.com/changeme点击sign in,提示Bad Gateway 打开调试 重装后依然如此,最后查阅githup issue 找到答案 https://github.com/NginxProxyManager/nginx-proxy-…

16.Redis 高级数据类型 + 网站数据统计

目录 1.Redis 高级数据类型 2.网站数据统计 2.1 业务层 2.2 表现层 2.2.1 记录数据 2.2.2 查看数据 1.Redis 高级数据类型 HyperLogLog&#xff1a;采用一种基数算法&#xff0c;用于完成独立总数的统计&#xff1b;占据空间小&#xff0c;无论统计多少个数据&#xff0…

Oraclelinux部署Oracle服务

采用图形化界面 user用户 oracle用户 #清屏 clear #设置主机名 hostnamectl set-hostname ceshidb sed -i 1,2 s/^/#/ /etc/hosts echo "127.0.0.1 ceshidb" >> /etc/hosts echo "::1 ceshidb" >> /etc/hosts ping -c 5…

STM32F4系列单片机库函数模板工程创建

目录 一、工程配置 1、新建工程 2、芯片选择 3、工程子文件夹创建 &#xff08;1&#xff09;FWLIB文件夹添加文件 &#xff08;2&#xff09;CORE文件夹添加文件 &#xff08;3&#xff09;USER文件夹添加文件 4、工程设置 &#xff08;1&#xff09;工程中添加文件夹…

记一次redis内存没满发生key逐出的情况。

现象&#xff1a; 从监控上看&#xff0c;redis的内存使用率最大是80%&#xff0c;但是发生了key evicted 分析&#xff1a; 原因1、可能是阿里云监控没抓取到内存100%监控数据。 阿里控制台监控监控粒度是5秒。 内存使用率的计算方法。 used_memory_human/maxmemory 原因2、…

uniapp APP应用程序iOS没有上架到苹果应用商店如何整包更新?

随着移动互联网的快速发展&#xff0c;uni-app 作为一种跨平台开发框架&#xff0c;受到了广泛欢迎。然而&#xff0c;有时候开发者可能会遇到一个问题&#xff1a;如何为已经发布到苹果应用商店的 uni-app APP 进行整包更新&#xff1f;尤其是当应用还没有上架到苹果应用商店时…

MongoDB数字字符串排序问题

问题描述 MongoDB中有一个集合t_test_sort结构如下&#xff0c;其中数值字段value为字符串类型&#xff0c;现想按照value的数值大小进行降序排列。 {"_id" : ObjectId("656c87b36ca8100cd4a60348"),"name" : "麻了","date&quo…

Spark与Hadoop的关系和区别

在大数据领域&#xff0c;Spark和Hadoop是两个备受欢迎的分布式数据处理框架&#xff0c;它们在处理大规模数据时都具有重要作用。本文将深入探讨Spark与Hadoop之间的关系和区别&#xff0c;以帮助大家的功能和用途。 Spark和Hadoop简介 1 Hadoop Hadoop是一个由Apache基金会…

Upload-lab(pass1~2)

Pass-1-js检查 这里检验 因为是前端js校验,所以只用绕过js前端校验 用burp抓包修改文件类型 写一个简易版本的php Pass-2-只验证Content-type 仅仅判断content-type类型 因此上传shell.php抓包修改content-type为图片类型&#xff1a;image/jpeg、image/png、image/gif

网安面试三十道题(持续更新)

91 mof提权 ## 是mysql的提权方式&#xff0c;在Linux下不能用&#xff0c;就是利用了 c:/windows/system32/wbem/mof/目录下的nullevt.mof文件&#xff0c;每分钟都会在一个特定的时间去执行一次的特征 sql语句&#xff1a; ## 通过shell上传这个文件&#xff0c;通过sql语句写…

Tg-5511cb: tcxo高稳定性+105℃高温

爱普生推的一款TG-5511CB是一种高稳定的TCXO温补晶体振荡器&#xff0c;频率范围十分广泛从 10mhz ~ 54mhz&#xff0c;它的电源电压只需要3.3V&#xff0c;无论是手机还是其他电子设备&#xff0c;都能轻松提供稳定的电力支持。频率/温度特性表现出色&#xff0c;0.28 10^6Ma…

目标检测-Two Stage-Fast RCNN

文章目录 前言一、Fast RCNN的网络结构和流程二、Fast RCNN的创新点1.特征提取分类回归合一2.更快的训练策略 总结 前言 前文目标检测-Two Stage-SPP Net中提到SPP Net的主要缺点是&#xff1a; 分开训练多个模型困难且复杂尽管比RCNN快10-100倍&#xff0c;但仍然很慢SPP Ne…