检测信号发送者(linux,ptrace)

时间:2010-03-29 16:08:36

标签: linux signals ptrace

我可以区分信号,直接传送到过程和通过调试器传送的信号。

案例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()生成的。

1 个答案:

答案 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是   忽略)。