Pour les utilisateurs de Linux, il existe un moyen très simple d'identifier la source d'un signal. Par exemple, ce qui suit consiste à trouver quelle tâche envoie SIGKILL aux autres.
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 exemple, quand j'ai utilisé '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
Sans le filtre 'sig==9' ci-dessus, 'trace' affichera tous les signaux envoyés entre les tâches.
Pas de l'extérieur du processus. Le deuxième argument du gestionnaire de signal est un siginfo_t
structure qui contient le PID du processus d'envoi comme l'un de ses membres. Voir sigaction(2)
pour plus de détails.
Ptrace
peut également être utilisé pour détecter l'expéditeur. Il y a un ptrace(GETSIGINFO)
call, qui donnera au débogueur une chance de lire (et éventuellement de modifier) siginto_t
structure.