我试图忽略SIGTRAP.我有以下概念证明代码:
#include <signal.h>
#include <stdlib.h>
int main(){
signal(SIGTRAP, SIG_IGN);
write(1, "A", 1);
asm("int3");
write(1, "B", 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我希望看到"AB",但我明白了
ATrace/breakpoint trap (core dumped)
Run Code Online (Sandbox Code Playgroud)
尽管忽略了SIGTRAP,为什么我的程序会终止?
根据该网站,被阻止/忽略的信号在引发时会在内核代码内自动解除阻止。因此,如果重复发出相同的信号,则不会发生无限循环。相反,应用程序会在第二次信号发出时终止,至少在 Linux 内核实现中是这样。
所以使用时raise(),SIGTRAP只会引发一次,不会造成任何问题。但asm("int3")处理器将重新执行发出信号的指令。第二次会导致进程终止。
相关的内核源代码(对于旧的2.6.27)在这里(函数force_sig_info):
939 if (blocked || ignored) {
940 action->sa.sa_handler = SIG_DFL;
941 if (blocked) {
942 sigdelset(&t->blocked, sig);
943 recalc_sigpending_and_wake(t);
944 }
945 }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |