阅读 linux 中的中断,我了解到它们的处理程序将运行直到完成(这里不考虑下半部分)。因此,假设我的代码已使用 while(1)
注册了 SIGINT
处理程序(使用 signal()/sigaction()
调用)-在其中循环(即处理程序永远不会返回)。
如果我在运行时突然退出我的程序,那么这种情况不应该完全卡住我的机器吗?我只有一个 CPU 核心的机器不会进入无限循环吗?
我的意思是;因为我的中断处理程序没有返回,CPU 不会只执行 while(1) 代码吗? (即没有其他进程有机会运行,因为在处理程序中不会有任何上下文切换/抢占,或者中断处理程序可以在运行 while(1) 循环之间被抢占吗?)
最佳答案
尽管信号处理程序和中断处理程序具有相似的处理方式,但您一定要混合使用它们。与编写内核代码不同,您不会直接遇到中断处理程序。
但是,信号处理程序的游戏规则非常相似。您应该退出信号处理程序或完成程序(并且,后者是用于停止整个系统的模拟,用于内核区域)。这包括将信号处理程序作为 longjmp() 退出的奇特方式。
从内核 POV 来看,中断处理程序中的永远循环中的进程与 main() 等普通代码段中具有相同循环的进程没有区别。输入信号处理程序会修改信号掩码,但不会从根本上改变事情。这样的进程可以像信号外一样被停止、跟踪、杀死。
(所有这些都不涉及一些具有高级凭证的特殊进程类。例如,X Window 服务器可能很特殊,因为它在处理视频适配器期间禁用了一些内核事件。但是您可能应该知道编写此类软件时所需的安全规则.)
关于Linux 信号和中断处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20719014/