异常的类别

分为四类:中断,陷阱,故障和终止

中断

最初引入中断是是出于性能上的考虑,处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,随后处理器就可再回头获取处理结果。后来被用于处理器外部与内部紧急事件的处理、机器故障处理、时间控制等。 如何处理中断见书 P.504。

陷阱和系统调用

这是一种有意的异常,其目的在于将控制权转交给内核以完成更高级别的调用。

故障

这通常是由于错误所引起的,所以可能被修正,一般会调度给错误处理程序,如果能够正确的处理并解除故障,则将在完成后重新执行该函数。否则,即没有被正确的处理,则会交给内核中的 abort 例程,他会直接终止出错的程序。

终止

对于不可以恢复的错误,则直接交给 abort 来终止它。

使用 fork 创建子进程,使用 wait 回收子进程

当回收了所有的子进程后,再调用 waitpid 就返回 -1,并设置 errno 为 ECHILD。

信号

每种类型最多只能有一个未处理的信号,所以会存在一个正在处理的信号和待处理信号,随后到达的信号会被简单的丢弃。

注意上文所说的每种类型,实际上信号是用一组线性 Bit 位来实现的,

Set 位向量,用于存储待处理信号。Block 位向量用于阻塞对应的向量。

可以使用 P.533 的函数改变当前阻塞信号的集合。

编写信号处理程序

注意三点。

  1. 信号是不会排队等待的,所以不能假定一个信号对应一个进程,更有可能是多个进程同时发出同样的信号。所以在收到信号时考虑到这里点,并尽可能多的处理信号触发的功能。