Linux 信号和中断处理程序

标签 linux signals posix interrupt

阅读 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/

相关文章:

Linux 中断不由包装器驱动程序处理

javascript - node.js 中 setInterval() 的奇怪行为(仅限 Windows,适用于 Linux)

linux - xarg,找到并 rm rm : cannot remove `./not' : No such file or directory

在C中使用fork创建n个后台进程

PHP exec fork 一个进程,使其崩溃返回代码仍然为 0

python - 如何在 Windows 上用 Python 捕获 SIGINT?

django - 有没有办法列出 Django 信号?

linux - Ubuntu Linux git gc 说错误 : failed to run repack

c - 当两个或多个线程或进程 ftruncate(2) 同一个文件时会发生什么?

linux - open(const char *path, int oflag) 不接受像 "~/my.log"这样的路径