Car*_*rum 17
我的strsignal(3)手册页说你可以直接从sys_signame数组中获取名称.这是我编写的一个简单的示例程序来测试它:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我认为这个程序产生了你正在寻找的输出:
$ ./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
Run Code Online (Sandbox Code Playgroud)
glib 2.32(2020-08-05 发布)引入了函数sigabbrev_np(int). 从那个版本开始你sys_siglist[]也不能再使用了。
从man strsignal:
该
sigabbrev_np()函数返回信号的缩写名称 sig。例如,给定值SIGINT,它返回字符串"INT"。
[...]
sigdescr_np() 和 sigdabbrev_np() 首次出现在 glibc 2.32 中。从版本 2.32 开始,glibc 不再导出 sys_siglist 符号。
从发行说明来看:
已添加
sigabbrev_np和功能。sigdescr_np返回sigabbrev_np缩写的信号名称(例如,"HUP"对于SIGHUP)[...] 对于无效的信号编号,两个函数都返回 NULL。应该使用它们来代替
sys_siglistor,sys_sigabbrev并且它们都是线程和异步信号安全的。这些函数是 GNU 扩展。