信号号码?

Mik*_*oll 25 c unix

如何快速从其编号中获取信号名称?有strsignal(),但我只想要名称,例如SIGUSR1

换句话说,如果我们有像SIGUSR1 -> 12 我们有类似的 宏 12 -> SIGUSR1吗?

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)

  • 似乎只有`strsignal`似乎是由POSIX定义的,像`sys_signame`这样的数组声明似乎是扩展名. (4认同)
  • 因此,这可能是OP在OS X上遇到的问题的答案,但不是问题的答案,因为它是制定的. (2认同)

Soc*_*owi 7

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 扩展。