15 - 信号处理设计模式

这篇具有很好参考价值的文章主要介绍了15 - 信号处理设计模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)Linux系统编程训练营 - 目录

1. Linux应用程序安全性讨论

1.1 问题

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

1.2 不同场景

1.2.1 场景一:不需要处理信号

应用程序实现单一功能,不需要关注信号
如:数据处理程序,文件加密程序,科学计算程序

1.2.2 场景二:需要处理信号

应用程序长时间运行,需要关注信号,并及时处理
如:服务端程序,上位机程序

2. 场景一:不需要信号处理(单一功能应用程序)

在代码层面,直接阻塞所有可能的信号(本质上就是信号始终处于未决状态,无法递达进程)

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

  • 编程实验:不需要处理信号

【参看链接】:15 - 信号处理设计模式 / 00不需要处理信号场景/main.c

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程
15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

3. 场景二:需要处理信号(长时间运行的应用)

  • 同步方案
    • 通过 标记 同步处理信号,整个应用中 只有一个执行流
  • 异步方案
    • 专用任务处理,应用中存在 多个执行流(多线程应用)
    • 设置 专用于信号处理的任务,其它任务忽略信号,专注功能实现

3.1 同步解决方案(单任务)

  • 信号处理逻辑与程序逻辑位于同一个上下文
    即:信号处理函数与主函数不存在资源竞争关系

3.1.1 方案设计一

  1. 将任务分解为 子任务(每个任务可对应一个函数)
  2. 信号递达时,信号处理函数中 标记 递达状态
  3. 子任务处理结束后,真正执行信号处理

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

3.1.1.1 同步方案示例一

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

3.1.1.2 编程实验

【参看链接】:15 - 信号处理设计模式 / 01处理信号场景_同步方案

  1. 对于不可靠信号

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程
15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

  1. 对于可靠信号存在问题

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程
15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程
15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

3.1.1.3 存在的问题
  • 由于给每个信号唯一的标记位置,因此,所有信号转变为不可靠信号,并且仅保留最近递达的信号信息。
  • 可能改进方案:
    • 标记位置设计为链表,信号递达后在对应位置的链表处增加结点保留信号信息
      (增加结点涉及到malloc,不安全)

3.1.2 方案设计二

  1. 将任务分解为子任务(每个任务可对应一个函数)
  2. 创建 信号文件描述符,并阻塞所有信号(可靠信号递达前位于内核队列)
    • 意义:化被动为主动,原先任务的执行流在收到信号后被动中断。现在主动去检查是否有信号,如果有信号,将信号取出来处理,此时就需要文件描述符。
  3. 子任务处理结束后,通过 select机制 判断是否有信号需要处理
    • true:处理信号,false:等待超时
3.1.2.1 关键系统函数

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

  • 使用signalfd()处理信号
    先屏蔽所有信号(无法递达进程),之后为屏蔽信号创建文件描述符,当时机成熟,通过read()系统调用读取未决信号(主动接收信号)。

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

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

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

  • 使用select()处理信号

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

3.1.2.2 编程实验

【参看链接】:15 - 信号处理设计模式 / 02处理信号场景_同步方案_select

  1. 可靠信号

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程
15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程
15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

  1. 不可靠信号

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程
15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

3.1.2.3 存在的问题
  • 虽然解决了信号丢失的问题,但是实时性不好。由于使用了select()机制,即便没有信号需要处理,也需要等待select超时,任务 实时性 受到影响

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

3.1.2.4 思考
  • 是否可以兼顾 信号处理任务执行 的实时性?

3.2 异步解决方案(多任务)

  • 使用独立任务处理信号,程序逻辑在其它任务中执行
    即:通过 多线程 分离信号处理与程序逻辑
    • 主线程:专用于处理信号
    • 其它线程:完成程序功能

3.2.1 问题

  • 信号递达进程后,在 哪一个执行流 中进行处理?

3.2.2 多线程信号处理

  • 信号的发送目标是 进程,而不是某个特定的线程
  • 发送给进程的信号仅递送给一个线程 ==> 哪一个线程处理?
  • 内核在不会阻塞目标信号的线程中进行随机选择
  • 每个线程拥有独立的信号屏蔽掩码

3.2.3 方案

  • 主线程:对目标信号设置信号处理的方式
    • 当信号递达进程时,只可能是 主线程 进行信号处理
  • 其它线程:首先屏蔽所有可能的信号(简单粗暴),之后执行任务代码
    • 无法接收到信号,不具备信号处理能力

3.2.4 进程与线程

  • 进程:应用程序的一次加载执行(系统进行资源分配的基本单位)
  • 线程:进程中的程序执行流
    • 一个进程可以存在多个线程(至少存在一个线程)
    • 每个线程执行不同的任务(多个线程可并行执行)
    • 同一个进程中的多个线程共享进程的系统资源
3.2.4.1 Linux多线程API函数

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

  • 线程标识:pthread_t pthread_self(void);
    • 获取当前线程的ID标识(tid)
  • 线程等待:int pthread_join(pthread_t thread, void** retval);
    • 等待目标线程执行结束
3.2.4.2 多线程编程示例

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

3.2.5 异步方案示例

  1. 主线程

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

  1. 任务线程

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

3.2.6 编程实验:多线程信号处理

【参看链接】:15 - 信号处理设计模式 / 03处理信号场景_异步方案_多线程

  1. 不可靠信号

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程

  1. 可靠信号

15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程
15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程
15 - 信号处理设计模式,Linux系统编程训练营,信号处理,设计模式,linux,Linux系统编程,线程,进程,多线程文章来源地址https://www.toymoban.com/news/detail-590839.html

4. 信号设计模式小结

  • 多数程序不需要处理信号,因此可直接屏蔽信号
  • 需要处理信号的程序,重点考虑信号安全性问题
    • 同步 处理方案,通过设计让 任务代码信号处理代码 交替执行
      问题:信号处理是否及时?任务执行是否实时?
    • 异步 处理方案,任务代码信号处理代码 位于 不同执行流
      问题:将信号安全性问题转换为线程安全性问题,因此,程序本身是否做到线程安全?

到了这里,关于15 - 信号处理设计模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux从入门到精通】信号(信号保存 & 信号的处理)

      本篇文章接着信号(初识信号 信号的产生)进行讲解。学完信号的产生后,我们也了解了信号的一些结论。同时还留下了很多疑问: 上篇文章所说的所有信号产生,最终都要有OS来进行执行,为什么呢? OS是进程的管理者 。 信号的处理是否是立即处理的? 在合适的时候。

    2024年02月09日
    浏览(41)
  • 【数字信号处理课程设计】基于MATLAB实现语音信号的采集与处理(偏重滤波)

    目录 一、目标与任务 二、原理介绍 2.1 录音原理 2.2 滤波器的设计原理及设计方法 2.3 IIR 数字滤波器设计原理 2.4 双线性变换法 三、GUI界面设计与实现 四、基于MATLAB仿真 4.1实验过程 4.2 结果分析 五、总结 5.1 函数用法总结 5.2 心得体会 六、参考文献 这个项目在我的B站上有专

    2024年01月18日
    浏览(52)
  • 【linux】进程信号——信号的保存和处理

    上一章主要讲述了信号的产生:【linux】进程信号——信号的产生 这篇文章主要讲后面两个过程。 实际执行信号的处理动作称为 信号递达 (Delivery)。 信号从产生到递达之间的状态,称为 信号未决 (Pending)。 因为信号 不是被立即处理的 ,所以在信号产生之后,递达之前的这个

    2024年02月03日
    浏览(38)
  • 【Linux】进程信号 -- 信号保存与递达 | 信号捕捉 | 僵尸进程的信号处理方法

    实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 已经收到但未处理的状态 进程可以选择阻塞 (Block )某个信号 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作 注意,阻塞和忽略是

    2024年02月16日
    浏览(44)
  • Linux进程 ----- 信号处理

    目录 前言 一、信号的处理时机 1.1 处理时面临的情况 1.2 “合适”的时机 二、用户态与内核态 2.1 概念理论 2.2 再现 进程地址空间 2.3 信号处理过程 三、信号的捕捉 3.1 内核实现 3.2 sigaction 四、信号部分小结 从信号产生到信号保存,中间经历了很多,当操作系统准备对信号进

    2024年03月21日
    浏览(75)
  • linux信号处理机制

            信号检测是项目开发中必不可少的!提到信号处理机制,很多人都会想到signal函数吧         除了这种方式,还有一种操作信号集的方式更为精确,能够屏蔽,添加,删除,操作等某个信号。这些函数仅支持对 POSIX 信号集进行操作。首先了解下这几个函数: 描

    2024年01月23日
    浏览(42)
  • Linux——信号处理

    在Linux系统中, 信号处理 是一个非常重要的概念,它允许 操作系统在特定事件发生时 通知进程。信号可以由 硬件异常、用户输入、软件条件 等多种来源产生。为了有效地处理这些信号,Linux提供了一系列的系统调用和函数,其中 signal 、 sigaction 和 sigprocmask 是三个核心的函

    2024年03月09日
    浏览(33)
  • 【Linux学习】信号——信号保存 | 信号处理 | 不可重入函数,volatile,SIGCHLD信号

    🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言: 你只管努力,剩下的交给时间! 信号的产生以及详细讲解了,有兴趣的小伙伴可以去看看,传送门。接下来介绍信号的保存和信号处理。 首先介绍几个新的概念: 信号递达(Delivery):实际执行信号的处理动作。 信号

    2023年04月14日
    浏览(41)
  • 【Linux】信号的处理

    信号篇终章 文章目录 前言 一、信号的处理         1.可重入函数         2.volatile         3.SIGCHLD信号 总结 在前两篇linux文章中我们详细的讲解了信号的产生和信号的保存,今天来到最后一个重点信号的处理,对于信号的处理我们会重新引入进程地址空间的知识,并

    2024年02月05日
    浏览(34)
  • MATLAB——信号处理仿真功能课程设计报告

    摘    要... I 目    录. II 1 设计目的及内容. 1 1.1 课程设计目的. 1 1.2 课程设计内容. 1 2 课程设计基本原理. 3 2.1 基本信号. 3 2.2 计算原理. 3 3 设计与仿真. 4 3.1 基本信号. 4 3.2计算过程. 6 3.3 matlab仿真原理. 7 3.4 计算结果. 8 3.5结果分析. 10 总    结. 12 参 考 文 献. 13 附录 仿真

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包