跟踪UNIX信号来源?

时间:2010-05-13 15:11:29

标签: linux signals unix

如果我有一个接收来自其他进程的信号的进程,有没有办法告诉我哪个进程(如果有的话)发送了一个信号?

strace让我跟踪一个进程收到的信号,但不允许我跟踪发出进程的人。

3 个答案:

答案 0 :(得分:8)

不是来自流程之外。信号处理程序的第二个参数是siginfo_t结构,它包含作为其成员之一的发送进程的PID。有关详细信息,请参阅sigaction(2)

答案 1 :(得分:2)

Ptrace也可用于检测发件人。有ptrace(GETSIGINFO)调用,这将使调试器有机会阅读(并且可能更改)siginto_t结构。

答案 2 :(得分:2)

对于Linux用户,有一种非常简单的方法来识别信号源。例如,下面是查找哪个任务将SIGKILL发送给其他任务。

cd /sys/kernel/debug/tracing
echo 'sig==9' > events/signal/signal_generate/filter 
echo 1 > events/signal/signal_generate/enable
: > trace
echo 1 > tracing_on
tail -f trace

一个实例,当我使用“ pkill -9 sleep”时。

# cat trace
[...]
       pkill-2982  [001] d... 750347.835838: signal_generate: sig=9 errno=0 code=0 comm=sleep pid=2981 grp=1 res=0

没有在“ sig == 9”过滤器上方,“ trace”将显示任务之间发送的所有信号。