2010-03-29 44 views
3

我可以区分直接发送到进程并通过调试器发送的信号吗?检测信号的发送者(linux,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()生成的。

+0

我敢肯定,这是一个很好的问题,但它是有帮助的预留与线性时不变系统涉及的东西类型的“信号处理”的标签,快速傅里叶变换,幅度和相位等,或者也许有人有更好的解决方案。 – 2010-03-29 16:33:32

+0

@Steve,谢谢。你是对的。 – osgx 2010-03-29 16:37:10

回答

2

人ptrace的:(http://linux.die.net/man/2/ptrace

PTRACE_GETSIGINFO(因为Linux 2.3.99-PRE6)检索关于导致停止信号信息。 复制一个siginfo_t结构(参见 的sigaction(2))从子到父 位置数据。 (地址 忽略。)

PTRACE_SETSIGINFO(自Linux 2.3.99-pre6)设置信号信息。将亲子位置数据中的 siginfo_t结构复制到 孩子。这只会影响通常会被传递到 孩子和由 示踪剂捕获信号 。 它可能难以分辨() 本身通过ptrace的生成的合成信号 这些 正常信号。 (地址将被忽略。)

PTRACE_CONT重新启动停止 子进程。如果数据非零且 不是SIGSTOP,则将其解释为要发送给子代的 信号;否则,不会传送信号。 因此,例如,父母可以控制是否发送发送给 孩子的信号。 (addr是 忽略)。

+0

因此,使用SETSIGNFO/GETSIGINFO调试器在信号传递中将是透明的。 – osgx 2010-03-30 13:19:37