如何编写信号安全的应用程序???
项目代码
https://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);- 等待目标线程执行结束

1万+

被折叠的 条评论
为什么被折叠?



