好像difference between a trap and an interrupt似乎是清楚的:陷阱是对内核的软件调用调用(例如通过异常),并且中断与硬件(磁盘,I / O和外围设备,如鼠标和键盘...)(了解有关the difference here)的更多信息。
知道这一点,按什么类别按Control + C来结束一个过程?它是一个软件调用的调用,因此它是陷阱,因为它可以从Shell等执行,或者它是一个中断,因为它是CPU从键盘接收的信号?或者是完全在用户域之外的中断,这意味着硬件与CPU交互的程度是用户无法达到的水平?
谢谢!
答案 0 :(得分:4)
首先是信号 - 按Control-C会使内核向当前前台进程发送信号(SIGINT类型)。如果该进程没有为该信号设置处理程序(使用来自signal()
系列的系统调用之一),则会导致该进程被终止。
我想,信号是"中断"信号,但这与硬件中断无关。这些只在内核中使用。
答案 1 :(得分:3)
陷阱和中断之间的区别不是您在问题中所描述的(感谢参考),而是产生它的事件的异步性质。陷阱意味着代码执行中的中断是由于通常不正确/内部操作(如除以零或页面错误,或者您发出信号,软件中断),但它始终位于代码中的同一位置(同步)由于外部硬件的原因,当一些设备发出信号通知cpu中断它正在做什么时,因为它已准备好发送一些数据。从本质上讲,陷阱是同步的,中断不是。
说这两个都是异常事件,改变了cpu的正常执行过程。两者都是硬件生成,但出于不同的原因:第一个同步发生(你总是当时,在哪个指令中,它将被生成,如果生成的话)和第二个不是(当外部硬件断言中断线时,你事先不知道将执行哪个指令)另外,有两种陷阱(取决于触发它们的事件),一个将指令指针指向要执行的下一条指令(例如除以零陷阱),另一条指令指向导致陷阱的同一条指令(例如页面错误,一旦陷阱的原因得到纠正,必须重新执行当然,软件中断,就其本质而言,总是陷阱(陷阱总是改变执行过程),因为可以预测程序流中cpu将被中断的确切点。
所以,通过这个解释,你可能会回答你的问题, Ctrl-C 中断是中断,因为你不能提前预测它会中断cpu执行,你无法在代码中标记这一点。
请记住,中断是异步的,不是陷阱。
答案 2 :(得分:2)
在Linux系统上按下Ctrl+C
用于使用信号SIGINT
来终止进程,并且可以被程序截获,以便它可以在退出之前清理自己,或者不退出所有
如果它是一个陷阱,它会立即死亡!
因此,它是一种软件中断!
答案 3 :(得分:0)
Control-C不是中断......至少不在PC(现在是MAC)硬件上。换句话说,键盘控制器不会为组合键“control”和“C”生成特定的中断。
键盘仅使用一个中断向量,该向量在按键向下和按键上触发。键盘是一个非常慢的硬件设备。将密钥重复率设置为最快,按住一个键每秒产生33个中断。
如果操作系统的设计者认为控制-C非常重要,他们可能会包含测试“这是关键的”C“AND是”控制“键触发键盘中断数十亿机器周期前?然后,在处理键盘中断的同时,它们将使用软件中断指令生成陷阱。
更好的操作系统会将键盘中断的处理时间缩短到最低限度。它们只是附加一个循环缓冲区(环形缓冲区)的密钥代码,包括按下/释放的位,并立即终止中断。
然后,只要有时间,操作系统就会注意到环形缓冲区指针的变化。它会触发从环形缓冲区中提取密钥代码的代码,验证该代码是否代表“ctrl-C”组合,并设置一个标志“ctrl-C”被检测到。
最后,当调度程序准备好运行属于当前进程的线程时,它会检查标志“ctrl-C”被检测到。如果是这种情况,调度程序将PC设置为指向SIGINT例程而不是恢复到上一个执行地址。
无论细节如何,“ctrl-C”都不能成为中断。如果从键盘中断调用它或者它是由调度程序异步测试的同步对象,则它是一个陷阱。