信号处理设计模式_学习笔记

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

项目代码icon-default.png?t=N7T8https://gitee.com/zhudingyi/linux-learning-warehouse.git

Linux应用程序安全性讨论

场景一:不需要处理信号
        应用程序实现单一功能,不需要关注信号
场景二:需要处理信号
         应用程序长时间运行,需要关注信号,并及时处理
        同步方案:通过标记同步处理信号,整个应用中只有一个执行流
        异步方案:专用任务处理,应用中存在多个执行流(多线程应用),设计专用信号处理任务,其            他任务忽略信号,专注功能实现。

同步解决方案(单任务)

  • 信号处理逻辑死心与程序逻辑位于同一个上下文
    • 即:信号处理函数与主函数不存在资源竞争关系
  • 方案设计一
    • 将任务分解子任务(每个任务可对应一个函数)
    • 信号递达时,信号处理函数中仅标记递达状态
    • 子任务处理结束后,真正执行信号处理
  • 方案设计二
    • 将任务分解为子任务(每个任务可对应一个函数)
    • 创建信号文件描述符,并阻塞所有信号(可靠信号递达前位于内核队列中)
    • 子任务处理结束后,通过select机制判断是否有信号需要处理
      • true->处理信号     false->等待超时

 

异步解决方案(多任务)

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

多线程信号处理

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

异步解决方案(多任务)

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

进程:应用程序的一次加载执行(系统进行资源分配的基本单位)        

线程:进程中的程序执行流

  • 一个进程可以存在多个线程(至少存在一个线程)
  • 每个线程执行不同的任务(多个线程可并行执行)
  • 同一个进程中的多个线程共享进程的系统资源
  • 线程标识:pthread_t pthread_self(void);
    • 获取当前线程的ID标识(tid)
  • 线程等待:int pthread_join(pthread_t thread, void** retval);
    • 等待目标线程执行结束

信号设计模式小结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值