CSAPP 读书笔记-第八章异常控制流
8.1.2 异常的类别
1. 中断
中断是异步发生的,是来自处理器外部的 I/O 设备的信号的结果。硬件中断不是由任何一条专门的指令造成的,从这个意义上来说它是异步的。
剩下的异常类型是同步发生的,是执行当前指令的结果。我们把这类指令叫做故障指令。
2. 陷阱和系统调用
陷阱是有意的异常,是执行一条指令的结果。就像中断处理程序一样,陷阱处理程序将控制返回到下一条指令。陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用。
3. 故障
当故障发生时,处理器将控制转移给故障处理程序。如果处理程序能够修正这个错误情况,它就将控制返回到引起故障的指令,从而重新执行它。否则,处理程序返回到内核中的 abort
例程,abort
例程会终止引起故障的应用程序。
4. 终止
终止处理程序从不将控制返回给应用程序。
8.2.4 用户模式和内核模式
Linux 提供了一种聪明的机制,叫做 /proc
文件系统,它允许用户模式进程访问内核数据结构的内容。/proc
文件系统将许多内核数据结构的内容输出为一个用户程序可以读的文件文本的层次结构。
比如 CPU 类型(/proc/cpuinfo
),或者某个特殊的进程使用的内存段(/proc/<process-id> /maps
)。
2.6 版本的 Linux 内核引入 /sys
文件系统,它输出关于系统总线和设备的额外的低层信息。
8.5 信号
Linux 信号是一种更高层的软件形式的异常,它允许进程和内核中断其他进程。
一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件。
信号提供了一种机制,通知用户进程发生了这些异常。比如,如果一个进程试图除以 0,那么内核就发送给它一个 SIGFPE 信号(号码 8)。如果一个进程执行一条非法指令,那么内核就发送给它一个 SIGILL 信号(号码 4)。如果进程进行非法内存引用,内核就发送给它一个 SIGEGV 信号(号码 11)。
8.5.2 发送信号
Unix 系统提供了大量向进程发送信号的机制。所有这些机制都是基于进程组(process group)这个概念的。
2. 用 /bin/kill
程序发送信号
1 | /bin/kill -9 15213 |
发送信号 9(SIGKILL)给进程 15213。一个为负的 PID 会导致信号被发送到进程组 PID 中的每个进程。
4. 用 kill
函数发送信号
进程通过调用 kill
函数发送信号给其他进程(包括它们自己)。
5. 用 alarm
函数发送信号
进程可以通过调用 alarm
函数向它自己发送 SIGALRM 信号。
8.5.3 接收信号
进程可以通过使用 signal
函数修改和信号相关联的默认行为。唯一的例外是 SIGSTOP 和 SIGKILL,它们的默认行为是不能修改的。
8.7 操作进程的工具
- STRACE:打印一个正在运行的程序和它的子进程调用的每个系统调用的轨迹。
- PMAP:显示进程的内存映射。