---- 整理自狄泰软件唐佐林老师课程
查看所有文章链接:(更新中)Linux系统编程训练营 - 目录
文章目录
- 1. 信号的可靠性
- 1.1 问题
- 1.2 信号查看(kill -l)
- 1.3 信号的分类
- 1.3.1 不可靠信号(传统信号)
- 1.3.2 可靠信号(实时信号)
- 1.3.3 信号小知识补充
- 1.4 不可靠信号 vs 可靠信号
- 1.5 一些注意事项
- 1.6 信号可靠性实验设计
- 1.7 编程实验:信号可靠性实验
- 2. 基于信号的进程间通信实验
- 2.1 状态设计
- 2.2 数据发送进程关键实现
- 2.3 数据接收进程关键实现
- 2.4 编程实验:进程间通信实验
1. 信号的可靠性
1.1 问题
- 基于信号发送的进程间通信方式可靠吗???
1.2 信号查看(kill -l)
1.3 信号的分类
1.3.1 不可靠信号(传统信号)
- 信号值在 [1, 31] 之间的所有信号
1.3.2 可靠信号(实时信号)
- 信号值在[SIGRTMIN, SIGRTMAX],即: [34, 64]
SIGRTMIN ==> 34
SIGRTMAX ==> 64
1.3.3 信号小知识补充
- 信号32与信号33(SIGCANCEL & SIGSETXID)被 NPTL线程库 征用
- (征用意指被明确赋予了含义)
- NPTL ==> Native Posix Threading Library
- 即:POSIX线程标准库,Linux可以使用这个库进行多线程编程
- 对于Linux内核,信号32是最小的可靠信号
- SIGRTMIN在signal.h中定义,不同平台的linux可能不同(arm linux)
1.4 不可靠信号 vs 可靠信号
- 不可靠信号
- 内核 不保证 信号可以递送到目标进程(内核对信号状态进行标记)
- 如果信号处于未决状态(从信号产生到信号被进程接收之间的状态),并且相同信号被发送,内核丢弃后续相同信号
- 进程只知道一个不可靠信号是否递达,没有办法知道这个不可靠信号递达了几次
- 可靠信号
- 内核维护信号队列,未决信号位于队列中,因此 信号不会被丢弃
- 严格意义上,信号队列 有上限,因此不能无限制保存可靠信号
1.5 一些注意事项
- 不可靠信号的默认处理行为可能不同(忽略,结束)
- 可靠信号的默认处理行为都是结束进程
- 信号的可靠性由信号数值决定,与发送方式无关
- 信号队列的上限可通过命令设置
- 查询信号队列上限:ulimit -i
- 设置信号队列上限:ulimit -i 10000
1.6 信号可靠性实验设计
- 目标:验证信号可靠性(不可靠信号 or 可靠信号)
- 方案:对目标进程“疯狂”发送N次信号,验证信号处理函数调用次数是怎么样的
- 预备函数:
int sigaddset(sigset_t* set, int signum);
int sigdelset(sigset_t* set, int signum);
int sigfillset(sigset_t* set);
int sigemptyset(sigset_t* set);
int sigprocmask(int how, const sigset_t* set, sigset_t* oldset);
1.7 编程实验:信号可靠性实验
【参看链接】:13 - 信号可靠性剖析 / 13 / 00信号可靠性实验
- 不可靠信号
- 可靠信号
- ulimit
2. 基于信号的进程间通信实验
- 发送端:A 进程将 TLV 类型的数据 通过可靠信号传递给B进程
- TLV:(type, length, value)
- 由于可靠信号的限制,每次传输 4字节数据
- 接收端:B进程首先接收4字节数据(type或type+length)
- 根据接收到的length信息,多次接收后续的字节数据
- 每次只能接收4字节数据,设计层面需要进行 状态处理
2.1 状态设计
2.2 数据发送进程关键实现
2.3 数据接收进程关键实现
2.4 编程实验:进程间通信实验
【参看链接】:13 - 信号可靠性剖析 / 13 / 01进程间通信