Linux信号和中断处理程序

时间:2013-12-21 12:30:55

标签: linux signals posix interrupt

阅读linux中的中断,我知道他们的处理程序将运行直到完成(不要在这里考虑下半部分)。因此,假设我的代码已注册SIGINT处理程序(使用signal()/sigaction()调用)并且其中包含while(1)循环(即处理程序永远不会返回)。

如果我在跑步时突然退出程序,那么这种情况不应该完全冻结我的机器吗?只有一个CPU内核的机器不会进入无限循环吗?

我的意思是;因为我的中断处理程序没有返回,所以CPU不会仅仅执行while(1)代码吗? (即没有其他进程可以运行,因为处理程序中不会有任何上下文切换/抢占,或者中断处理程序是否可以在运行while(1)循环之间被抢占?)

1 个答案:

答案 0 :(得分:0)

尽管它们有类似的处理方式,但你肯定会混合信号处理程序和中断处理程序。与编写内核代码不同,您不会直接遇到中断处理程序。

但是,信号处理程序的游戏规则非常相似。您应该退出信号处理程序或完成程序(并且后者是模拟的,用于停止整个系统,对于内核域)。这包括退出信号处理程序的奇特方式,如longjmp()。

从内核POV开始,中断处理程序中永久循环中的进程与main()等常用代码段中具有相同循环的进程没有区别。输入信号处理程序会修改信号掩码,但不会彻底改变信号。这种过程可以以与信号外部相同的方式停止,追踪,杀死。

(所有这些都与一些具有高级凭据的特殊进程类无关。例如,X Window服务器可能是特殊的,因为它在视频适配器处理期间禁用了一些内核活动。但是在编写此类软件时您可能应该知道所需的安全规则。)