c++ - 执行 int 3 中断会停止 Linux 上的整个进程还是仅停止当前线程?

标签 c++ c linux multithreading interrupt-handling

假设架构是 x86。操作系统是基于 Linux 的。给定一个多线程进程,其中单个线程执行 int 3 指令,中断处理程序是停止执行整个进程还是只停止执行 int 3 指令的线程?

最佳答案

由于问题是特定于 Linux 的,让我们深入研究内核源代码!我们知道 int 3 会生成一个 SIGTRAP,正如我们在 do_int3 中看到的那样. default behaviour of SIGTRAP就是终止进程并转储核心。

do_int3 调用 do_trap经过大量间接调用后,调用 complete_signal ,大部分魔法发生的地方。在评论之后,无需太多解释就可以很清楚地看到正在发生的事情:

  • 找到一个线程来传递信号。主线程获得优先破解权,但任何线程都可以获得它,除非明确声明它不想这样做。
  • SIGTRAP 是致命的(我们假设我们想要建立默认行为是什么)并且必须转储核心,所以它对整个组都是致命的
  • 第 1003 行的循环唤醒所有线程并传递信号。

编辑:回答评论:

当进程被 ptraced 时,行为在 manual page 中有很好的记录。 (见“信号传递停止”)。基本上,在内核选择一个处理信号的任意线程后,如果选择的线程被跟踪,它进入信号传递停止——这意味着信号还没有传递给进程,可以被跟踪进程抑制.调试器就是这种情况:死进程在调试时对我们没有用(这不完全正确,但让我们考虑实时调试场景,这是在这种情况下唯一有意义的场景),所以默认情况下除非用户另有说明,否则我们会阻止 SIGTRAP。在这种情况下,被跟踪进程如何处理 SIGTRAP(SIG_IGN 或 SIG_DFL 或自定义处理程序)是无关紧要的,因为它永远不会知道它发生了。

请注意,在 SIGTRAP 的情况下,跟踪程序进程必须考虑除进程被停止之外的各种情况,每个 ptrace 操作下的手册页中也有详细说明。

关于c++ - 执行 int 3 中断会停止 Linux 上的整个进程还是仅停止当前线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22379105/

相关文章:

c# - 使用单声道从 C++ 传递 C# 枚举

c++ - 在不接触类的情况下添加转换构造函数

c++ - dll 链接静态库 - 来自未使用函数的未解析链接器符号

regex - sed 命令在 block /段落后插入行并在文件中进行更改

c++ - mmap的简明指针算法

c++ - 留着 mustache 的表情是什么: “<:]{%>”?

c编程结构指针的动态分配

c - 从 2 个字符串生成一个字符串

linux - 如何设置 cron 在特定时间只运行一次文件?

c++ - Python 和 C++ 应用程序的简单但快速的 IPC 方法?