Process

如何檢查程序正在收聽的信號?

  • February 13, 2021

如何驗證正在執行的程序是否會擷取信號、忽略信號或阻止信號?理想情況下,我希望查看信號列表,或者至少不必實際發送信號進行檢查。

在 Linux 下,你可以找到你的程序的 PID,然後查看/proc/$PID/status. 它包含描述哪些信號被阻止 (SigBlk)、忽略 (SigIgn) 或擷取 (SigCgt) 的行。

# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...

右邊的數字是位遮罩。如果將其從十六進制轉換為二進制,則每個 1 位代表一個擷取的信號,從 1 開始從右到左計數。因此通過解釋 SigCgt 行,我們可以看到我的init程序正在擷取以下信號:

00000000280b2603 ==> 101000000010110010011000000011
                    | |       | ||  |  ||       |`->  1 = SIGHUP
                    | |       | ||  |  ||       `-->  2 = SIGINT
                    | |       | ||  |  |`----------> 10 = SIGUSR1
                    | |       | ||  |  `-----------> 11 = SIGSEGV
                    | |       | ||  `--------------> 14 = SIGALRM
                    | |       | |`-----------------> 17 = SIGCHLD
                    | |       | `------------------> 18 = SIGCONT
                    | |       `--------------------> 20 = SIGTSTP
                    | `----------------------------> 28 = SIGWINCH
                    `------------------------------> 30 = SIGPWR

kill -l(我通過從 bash執行找到了數字到名稱的映射。)

編輯:根據大眾的需求,一個腳本,在 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

引用自:https://unix.stackexchange.com/questions/85364