我可以区分信号,直接传送到过程和通过调试器传送的信号。
案例1:
$ ./process1
process1 (not ptraced)
//set up handler
alarm(5);
....
//signal is handled and I can parse handler parameters
案例2:
$ debugger1 ./process1
process1 (is ptraced by debugger1)
//set up handler
alarm(5);
...
//signal is catched by debugger1. It resumes process1 with PTRACE_CONT,
// signal_number is 4th parameter of PTRACE_CONT.
//signal is redelivered to process1
//and then is handled.
那么,如何在信号处理程序中检测,是由调试器重新传送还是由系统发送?
操作系统是Linux,内核是2.6.30。程序是用简单的C编写的。在实际程序中使用了SIGALRM,但它不是由alarm()
生成的,而是由setitimer()
生成的。
答案 0 :(得分:2)
man ptrace:(http://linux.die.net/man/2/ptrace)
PTRACE_GETSIGINFO(自Linux以来) 2.3.99-pre6)检索导致停止的信号的信息。 复制siginfo_t结构(请参阅 sigaction(2))从孩子到 父级中的位置数据。 (addr是 忽略)。
PTRACE_SETSIGINFO(自Linux以来) 2.3.99-pre6)设置信号信息。从中复制siginfo_t结构 位于父级的位置数据 儿童。这只会影响信号 通常会送到 孩子被抓住了 示踪剂。 可能很难分辨 这些来自合成的正常信号 ptrace()生成的信号 本身即可。 (addr被忽略。)
PTRACE_CONT重新开始停止 儿童过程。如果数据非零并且 不是SIGSTOP,它被解释为 发送给孩子的信号; 否则,没有信号传递。 因此,例如,父母可以 控制是否发送信号给 孩子是否被送达。 (addr是 忽略)。