Linux信号透彻分析理解与各种实例讲解

本文将从以下几个方面来阐述信号:
(1)信号的基本知识
(2)信号生命周期与处理过程分析
(3) 基本的信号处理函数
(4) 保护临界区不被中断
(5) 信号的继承与执行
(6)实时信号中锁的研究
第一部分: 信号的基本知识
1.信号本质:
信号的本质是软件层次上对中断的一种模拟 。 它是一种异步通信的处理机制 , 事实上 , 进程并不知道信号何时到来 。
2.信号来源
(1)程序错误 , 如非法访问内存
(2)外部信号 , 如按下了CTRL+C
(3)通过kill或sigqueue向另外一个进程发送信号
3.信号种类
信号分为可靠信号与不可靠信号,可靠信号又称为实时信号 , 非可靠信号又称为非实时信号 。
信号代码从1到32是不可靠信号,不可靠信号主要有以下问题:
(1)每次信号处理完之后 , 就会恢复成默认处理 , 这可能是调用者不希望看到的
(2)存在信号丢失的问题
现在的Linux对信号机制进行了改进 , 因此 , 不可靠信号主要是指信号丢失 。
信号代码从SIGRTMIN到SIGRTMAX之间的信号是可靠信号 。 可靠信号不存在丢失 , 由sigqueue发送 , 可靠信号支持排队 。
可靠信号注册机制:
内核每收到一个可靠信号都会去注册这个信号 , 在信号的未决信号链中分配sigqueue结构 , 因此 , 不会存在信号丢失的问题 。
不可靠信号的注册机制:
而对于不可靠的信号 , 如果内核已经注册了这个信号 , 那么便不会再去注册 , 对于进程来说 , 便不会知道本次信号的发生 。
可靠信号与不可靠信号与发送函数没有关系 , 取决于信号代码 , 前面的32种信号就是不可靠信号 , 而后面的32种信号就是可靠信号 。
4.信号响应的方式
(1)采用系统默认处理SIG_DFL,执行缺省操作
(2)捕捉信号处理 , 即用户自定义的信号处理函数来处理
(3)忽略信号SIG_IGN ,但有两种信号不能被忽略SIGKILL , SIGSTOP
第二部分: 信号的生命周期与处理过程分析
1. 信号的生命周期
信号产生->信号注册->信号在进程中注销->信号处理函数执行完毕
(1)信号的产生是指触发信号的事件的发生
(2)信号注册
指的是在目标进程中注册 , 该目标进程中有未决信号的信息:
struct sigpending pending:struct sigpending{struct sigqueue *head, **tail;sigset_t signal;};struct sigqueue{struct sigqueue *next;siginfo_t info;} 其中 sigqueue结构组成的链称之为未决信号链 , sigset_t称之为未决信号集 。
*head,**tail分别指向未决信号链的头部与尾部 。
siginfo_t info是信号所携带的信息 。
信号注册的过程就是将信号值加入到未决信号集siginfo_t中 , 将信号所携带的信息加入到未决信号链的某一个sigqueue中去 。
因此 , 对于可靠的信号 , 可能存在多个未决信号的sigqueue结构 , 对于每次信号到来都会注册 。 而不可靠信号只注册一次 , 只有一个sigqueue结构 。
只要信号在进程的未决信号集中 , 表明进程已经知道这些信号了 , 还没来得及处理 , 或者是这些信号被阻塞 。
(3)信号在目标进程中注销
在进程的执行过程中 , 每次从系统调用或中断返回用户空间的时候 , 都会检查是否有信号没有被处理 。 如果这些信号没有被阻塞 , 那么就调用相应的信号处理函数来处理这些信号 。 则调用信号处理函数之前 , 进程会把信号在未决信号链中的sigqueue结构卸掉 。 是否从未决信号集中把信号删除掉 , 对于实时信号与非实时信号是不相同的 。
非实时信号:由于非实时信号在未决信号链中只有一个sigqueue结构 , 因此将它删除的同时将信号从未决信号集中删除 。
实时信号:由于实时信号在未决信号链中可能有多个sigqueue结构 , 如果只有一个 , 也将信号从未决信号集中删除掉 。 如果有多个那么不从未决信号集中删除信号 , 注销完毕 。
(4)信号处理函数执行完毕
执行处理函数 , 本次信号在进程中响应完毕 。
在第4步 , 只简单的描述了信号处理函数执行完毕 , 就完成了本次信号的响应 , 但这个信号处理函数空间是怎么处理的呢? 内核栈与用户栈是怎么工作的呢? 这就涉及到了信号处理函数的过程 。
信号处理函数的过程:
(1)注册信号处理函数
信号的处理是由内核来代理的 , 首先程序通过sigal或sigaction函数为每个信号注册处理函数 , 而内核中维护一张信号向量表 , 对应信号处理机制 。 这样 , 在信号在进程中注销完毕之后 , 会调用相应的处理函数进行处理 。
(2)信号的检测与响应时机