Für Linux-Benutzer gibt es eine sehr einfache Möglichkeit, die Quelle eines Signals zu identifizieren. Im Folgenden finden Sie beispielsweise heraus, welche Aufgabe SIGKILL an andere sendet.
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
Ein Beispiel, als ich 'pkill -9 sleep' verwendet habe.
# cat trace
[...]
pkill-2982 [001] d... 750347.835838: signal_generate: sig=9 errno=0 code=0 comm=sleep pid=2981 grp=1 res=0
Ohne den obigen 'sig==9'-Filter zeigt 'trace' alle Signale, die zwischen Tasks gesendet werden.
Nicht von außerhalb des Prozesses. Das zweite Argument für den Signalhandler ist ein siginfo_t
Struktur, die als eines ihrer Mitglieder die PID des sendenden Prozesses enthält. Siehe sigaction(2)
für weitere Details.
Ptrace
kann auch zur Erkennung des Absenders verwendet werden. Es gibt einen ptrace(GETSIGINFO)
aufrufen, was einem Debugger die Möglichkeit gibt, siginto_t
zu lesen (und möglicherweise zu ändern). struct.