Signal number to name?
glib 2.32 (released on 2020-08-05) introduced the function sigabbrev_np(int)
. Since that version you cannot use sys_siglist[]
anymore too.
From man strsignal
:
The
sigabbrev_np()
function returns the abbreviated name of the signal, sig. For example, given the valueSIGINT
, it returns the string"INT"
.
[...]
sigdescr_np() and sigdabbrev_np() first appeared in glibc 2.32. Starting with version 2.32, the sys_siglist symbol is no longer exported by glibc.
And from the release notes:
The functions
sigabbrev_np
andsigdescr_np
have been added. Thesigabbrev_np
returns the abbreviated signal name (e.g."HUP"
forSIGHUP
) [...] both functions return NULL for an invalid signal number.They should be used instead of
sys_siglist
orsys_sigabbrev
and they are both thread and async-signal safe. These functions are GNU extensions.
My strsignal(3)
man page says you can get the names directly from the sys_signame
array. Here's a simple example program I wrote to test it:
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
void upcase(char *s)
{
while (*s)
{
*s = toupper(*s);
s++;
}
}
int main(void)
{
for (int sig = 1; sig < NSIG; sig++)
{
char *str = strdup(sys_signame[sig]);
if (!str)
return -1;
upcase(str);
printf("%2d -> SIG%s\n", sig, str);
free(str);
}
return 0;
}
I think this program produces the output you're looking for:
$ ./example
1 -> SIGHUP
2 -> SIGINT
3 -> SIGQUIT
4 -> SIGILL
5 -> SIGTRAP
6 -> SIGABRT
7 -> SIGEMT
8 -> SIGFPE
9 -> SIGKILL
10 -> SIGBUS
11 -> SIGSEGV
12 -> SIGSYS
13 -> SIGPIPE
14 -> SIGALRM
15 -> SIGTERM
16 -> SIGURG
17 -> SIGSTOP
18 -> SIGTSTP
19 -> SIGCONT
20 -> SIGCHLD
21 -> SIGTTIN
22 -> SIGTTOU
23 -> SIGIO
24 -> SIGXCPU
25 -> SIGXFSZ
26 -> SIGVTALRM
27 -> SIGPROF
28 -> SIGWINCH
29 -> SIGINFO
30 -> SIGUSR1
31 -> SIGUSR2