No Linux, você pode encontrar o PID do seu processo e, em seguida, consultar /proc/$PID/status
. Ele contém linhas descrevendo quais sinais são bloqueados (SigBlk), ignorados (SigIgn) ou capturados (SigCgt).
# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...
O número à direita é uma máscara de bits. Se você convertê-lo de hex para binário, cada 1 bit representa um sinal capturado, contando da direita para a esquerda começando com 1. Então, interpretando a linha SigCgt, podemos ver que o meu processo init
está captando os seguintes sinais: / p>
00000000280b2603 ==> 101000000010110010011000000011
| | | || | || |'-> 1 = SIGHUP
| | | || | || '--> 2 = SIGINT
| | | || | |'----------> 10 = SIGUSR1
| | | || | '-----------> 11 = SIGSEGV
| | | || '--------------> 14 = SIGALRM
| | | |'-----------------> 17 = SIGCHLD
| | | '------------------> 18 = SIGCONT
| | '--------------------> 20 = SIGTSTP
| '----------------------------> 28 = SIGWINCH
'------------------------------> 30 = SIGPWR
(Encontrei o mapeamento de número para nome executando kill -l
do bash.)
EDITAR : E por demanda popular, um script, em POSIX sh.
sigparse () {
i=0
# bits="$(printf "16i 2o %X p" "0x$1" | dc)" # variant for busybox
bits="$(printf "ibase=16; obase=2; %X\n" "0x$1" | bc)"
while [ -n "$bits" ] ; do
i="$(expr "$i" + 1)"
case "$bits" in
*1) printf " %s(%s)" "$(kill -l "$i")" "$i" ;;
esac
bits="${bits%?}"
done
}
grep "^Sig...:" "/proc/$1/status" | while read a b ; do
printf "%s%s\n" "$a" "$(sigparse "$b")"
done # | fmt -t # uncomment for pretty-printing