Signal number to name?

后端 未结 3 484
长情又很酷
长情又很酷 2021-02-03 21:34

How can I quickly get signal name from its number? There is strsignal(), but I just want the name, e.g. SIGUSR1

In other words, if we have macros like

3条回答
  •  离开以前
    2021-02-03 22:06

    Tested below code on Ubuntu 16.04 and MIPS and it works fine.

    #include 
    #include 
    #include 
    #include 
    #include 
    
    extern const char * const sys_siglist[];
    
    void upcase(char *s)
    {
        while (*s)
        {
            *s = toupper(*s);
            s++;
        }
    }
    
    int main(void)
    {
        int sig;
        /*
           NSIG returns number of signals available in a system
           and it may vary according to platforms;Found on Ubuntu-16.04 it return 65
           where as in MIPS it is 31; Found in both the platforms it leads to core dump
           after signal 31 so limiting scanning of signal till 31 instead of using NSIG
        */
        for (sig = 1; sig < 32; sig++)
        {
            char *str = strdup(sys_siglist[sig]);
            if (!str)
                return -1;
    
            upcase(str);
            printf("%2d -> SIG%s\n", sig, str);
    
            free(str);
        }
    
        return 0;
    }
    

    The output of the above code on Ubuntu-16.04 (Intel x86_64 GNU/Linux):

     1 -> SIGHANGUP
     2 -> SIGINTERRUPT
     3 -> SIGQUIT
     4 -> SIGILLEGAL INSTRUCTION
     5 -> SIGTRACE/BREAKPOINT TRAP
     6 -> SIGABORTED
     7 -> SIGBUS ERROR
     8 -> SIGFLOATING POINT EXCEPTION
     9 -> SIGKILLED
    10 -> SIGUSER DEFINED SIGNAL 1
    11 -> SIGSEGMENTATION FAULT
    12 -> SIGUSER DEFINED SIGNAL 2
    13 -> SIGBROKEN PIPE
    14 -> SIGALARM CLOCK
    15 -> SIGTERMINATED
    16 -> SIGSTACK FAULT
    17 -> SIGCHILD EXITED
    18 -> SIGCONTINUED
    19 -> SIGSTOPPED (SIGNAL)
    20 -> SIGSTOPPED
    21 -> SIGSTOPPED (TTY INPUT)
    22 -> SIGSTOPPED (TTY OUTPUT)
    23 -> SIGURGENT I/O CONDITION
    24 -> SIGCPU TIME LIMIT EXCEEDED
    25 -> SIGFILE SIZE LIMIT EXCEEDED
    26 -> SIGVIRTUAL TIMER EXPIRED
    27 -> SIGPROFILING TIMER EXPIRED
    28 -> SIGWINDOW CHANGED
    29 -> SIGI/O POSSIBLE
    30 -> SIGPOWER FAILURE
    31 -> SIGBAD SYSTEM CALL
    

    The output of the above code on busybox (MIPS, Cavium):

     1 -> SIGHANGUP
     2 -> SIGINTERRUPT
     3 -> SIGQUIT
     4 -> SIGILLEGAL INSTRUCTION
     5 -> SIGTRACE/BREAKPOINT TRAP
     6 -> SIGABORTED
     7 -> SIGEMT TRAP
     8 -> SIGFLOATING POINT EXCEPTION
     9 -> SIGKILLED
    10 -> SIGBUS ERROR
    11 -> SIGSEGMENTATION FAULT
    12 -> SIGBAD SYSTEM CALL
    13 -> SIGBROKEN PIPE
    14 -> SIGALARM CLOCK
    15 -> SIGTERMINATED
    16 -> SIGUSER DEFINED SIGNAL 1
    17 -> SIGUSER DEFINED SIGNAL 2
    18 -> SIGCHILD EXITED
    19 -> SIGPOWER FAILURE
    20 -> SIGWINDOW CHANGED
    21 -> SIGURGENT I/O CONDITION
    22 -> SIGI/O POSSIBLE
    23 -> SIGSTOPPED (SIGNAL)
    24 -> SIGSTOPPED
    25 -> SIGCONTINUED
    26 -> SIGSTOPPED (TTY INPUT)
    27 -> SIGSTOPPED (TTY OUTPUT)
    28 -> SIGVIRTUAL TIMER EXPIRED
    29 -> SIGPROFILING TIMER EXPIRED
    30 -> SIGCPU TIME LIMIT EXCEEDED
    31 -> SIGFILE SIZE LIMIT EXCEEDED
    

提交回复
热议问题