Per gli utenti Linux, c'è un modo molto semplice per identificare la fonte di un segnale. Ad esempio, quanto segue è trovare quale attività invia SIGKILL ad altri.
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
Un esempio, quando ho usato '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
Senza il filtro 'sig==9' sopra, 'trace' mostrerà tutti i segnali inviati tra le attività.
Non dall'esterno del processo. Il secondo argomento per il gestore del segnale è un siginfo_t
struttura che contiene il PID del processo di invio come uno dei suoi membri. Vedi sigaction(2)
per maggiori dettagli.
Ptrace
può essere utilizzato anche per rilevare il mittente. C'è un ptrace(GETSIGINFO)
call, che darà a un debugger la possibilità di leggere (e, possibilmente, modificare) siginto_t
struct.