3

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

情况1:

 $ ./process1
 process1 (not ptraced)
 //set up handler
 alarm(5);
 ....
 //signal is handled and I can parse handler parameters

案例二:

 $ 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()

4

1 回答 1

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,则将其解释为要传递给子进程的信号;否则,不传递信号。因此,例如,父母可以控制发送给孩子的信号是否被传递。(地址被忽略。)

于 2010-03-30T13:16:20.140 回答