为什么忽略SIGTRAP不能使用asm?

我试图忽略SIGTRAP。 我有以下的validation码:

#include <signal.h> #include <stdlib.h> int main(){ signal(SIGTRAP, SIG_IGN); write(1, "A", 1); asm("int3"); write(1, "B", 1); return 0; } 

当我运行它,我期望看到“AB”,但我明白了

 ATrace/breakpoint trap (core dumped) 

为什么我的程序终止,尽pipe它忽略了SIGTRAP?

根据这个网站,一个被阻止/被忽略的信号在内核代码内被自动解除。 所以如果反复提出同样的信号,就不会发生无限循环。 相反,应用程序在第二次信号加载时终止,至少在Linux内核实现中。

所以当使用raise()SIGTRAP只会被提升一次,不会造成任何问题。 但是用asm("int3")处理器将重新执行提高信号的指令。 第二次这会导致进程终止。

相关的内核源代码(对于旧的2.6.27)在这里(function 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 }