【问题标题】:detect sender of signal (linux, ptrace)检测信号的发送者(linux,ptrace)
【发布时间】:2010-03-29 16:08:36
【问题描述】:

我可以区分直接传递给进程和通过调试器传递的信号吗?

案例一:

 $ ./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() 生成的。

【问题讨论】:

  • 我确信这是一个很好的问题,但是为处理线性时不变系统、FFT、幅度和相位的东西类型保留“信号处理”标签会很有帮助等。或者也许有人有更好的解决方案。
  • @Steve,谢谢。你是对的。

标签: linux signals ptrace


【解决方案1】:

man 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,它被解释为 信号传递给孩子; 否则,不传递信号。 因此,例如,父母可以 控制是否有信号发送到 孩子出生与否。 (地址是 忽略。)

【讨论】:

  • 因此,使用 SETSIGNFO/GETSIGINFO 调试器将在信号传递中透明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
相关资源
最近更新 更多