使用Control + C陷阱或中断的进程的突然结束?

时间:2014-09-18 18:45:18

标签: c linux process signals interrupt

好像difference between a trap and an interrupt似乎是清楚的:陷阱是对内核的软件调用调用(例如通过异常),并且中断与硬件(磁盘,I / O和外围设备,如鼠标和键盘...)(了解有关the difference here)的更多信息。

知道这一点,按什么类别按Control + C来结束一个过程?它是一个软件调用的调用,因此它是陷阱,因为它可以从Shell等执行,或者它是一个中断,因为它是CPU从键盘接收的信号?或者是完全在用户域之外的中断,这意味着硬件与CPU交互的程度是用户无法达到的水平?

谢谢!

4 个答案:

答案 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”都不能成为中断。如果从键盘中断调用它或者它是由调度程序异步测试的同步对象,则它是一个陷阱。