一.信号的概念
信号是信息的载体,Linux/UNIX 环境下,古老、经典的通信方式,现下依然是主要的通信手段。
Unix早期版本就提供了信号机制,但不可靠,信号可能丢失。Berkeley和AT&T都对信号模型做了更改,增加了可靠信号机制。但彼此不兼容。POSIX.1对可靠信号例程进行了标准化。
A给B发送信号,B收到信号前在执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完之后再继续。与中断类似,但信号是软件层面上实现的中断,早期常被称为“软中断”。
二.信号的特质:
1.简单,不能携带大量信息,必须满足某条件才可发送。
2.信号是通过软件层面上的实现,其实现手段导致信号有很强的延时性。
3.每个进程收到的所有信号,都是由内核负责发送的,内核处理。
三 .信号相关的事件和状态
产生信号:
按键产生:如Ctrltc、Ctrltz、Ctrl+\v1.
系统调用产生:如kill、raise、aborte2
软件条件产生:如定时器alarm
硬件异常产生:如:非法访问内存(段错误)、除0(浮点数例外)、内存对齐出错(总线错误)
命令产生:如:kil命令
递达:信号递送并且到达进程
未决:产生和递达之间的状态。主要由于“阻塞(屏蔽)”导致该状态。下文讲到的未决信号集是导致该状态的主要原因,会使某个信号处于被屏蔽状态,从而无法递达
递达后,信号的处理方式:
1.执行默认动作。
2.忽略(丢弃)
3.捕捉(调用户处理函数)
进程控制块PCB,除了包含进程Pid,进程状态,进程工作目录,用户 id,组id,
文件描述符表等,还应该包含了信号相关的信息 : 主要指阻塞信号集和未决信号集
四.阻塞信号集和未决信号集
阻塞信号集,也称信号屏蔽字,能够屏蔽信号。未决信号集则保存信号的状态,0表示未产生,1表示处于未决。
这两个信号集本质上都是位图,以0和1来表示信号的状态。
阻塞信号集:
将信号加入该集合后,对他们设置屏蔽,当屏蔽信号后,再收到该信号时,该信号的处理将推后,使其处于未决状态。
未决信号集:
1.信号产生,未决信号集中描述该信号的位由0立刻翻转为1,使其处于未决状态。当信号被处理后,对应位翻转回为0。这一时刻往往非常短暂(信号一旦翻转为1,就会被内核立即处理)。
2.信号产生后由于被阻塞(加入阻塞信号集)不能递达。在屏蔽解除前,信号一直处于未决状态。
五.信号四要素和常用信号
四要素:
默认处理动作
常用信号