Para los usuarios de Linux, existe una manera muy fácil de identificar la fuente de una señal. Por ejemplo, lo siguiente es encontrar qué tarea envía SIGKILL a otros.
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 ejemplo, cuando usé '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
Sin el filtro 'sig==9' anterior, 'trace' mostrará todas las señales enviadas entre tareas.
No desde fuera del proceso. El segundo argumento para el controlador de señales es un siginfo_t
estructura que contiene el PID del proceso de envío como uno de sus miembros. Ver sigaction(2)
para más detalles.
Ptrace
también se puede utilizar para detectar el remitente. Hay un ptrace(GETSIGINFO)
llamada, que le dará a un depurador la oportunidad de leer (y, posiblemente, cambiar) siginto_t
estructura.