C语言中的异常处理
异常处理一般有两种模型,一种是“终止模型”,一种是“恢复模型”。
“终止模型”中,将假设错误非常关键,以致于程序无法返回到异常发生的地方继续执行。一旦异常被抛出后,就表明错误已经无法挽回,也不能回来继续执行。“恢复模型”
中断
中断是由硬件设备产生的,而它们从物理上说就是电信号。电信号通过中断控制器发送给CPU,CPU判断接收到的中断来自于哪个硬件设备(这定义在内核中),最后由CPU发送给内核,由内核处理中断。
异常
异常包括很多方面,有出错、陷入、可编程异常
可编程异常:这类异常可由程序员用int指令来触发。在linux中,经常使用 int 0x80。硬件对可编程异常的处理与对trap的处理类似,即从这类异常返回时也是返回到触发异常的下一条指令。
出错保存的EIP指向触发异常的那条指令。因此,当从异常返回时,出错会重新执行那条指令。比如我们熟悉的缺页异常,由于是fault,所以当缺页异常处理完成之后,还会去尝试重新执行那条触发异常的指令。
陷入保存的EIP指向触发异常的那条指令的下一条指令,陷入不会重新执行因为异常的指令。陷入的最主要的应用是在调试中,被调试的进程遇到你设置的断点,会停下来等待你的处理,等到你让其重新执行了,它当然不会再去执行已经执行过的断点指令。
中断和异常的区别
1.产生源不同:异常是由CPU产生的,而中断是由硬件设备产生的。
2.中断是异步的,这意味着中断可能随时到来;异常在处理的时候必须考虑与处理器的时钟同步。
中断和异常的相同点
最后都是由CPU发送给内核,由内核去处理