2013-05-12 15 views
16

Jak szybko uzyskać nazwę sygnału z jego numeru? Jest strsignal(), ale chcę tylko nazwę, np. SIGUSR1Numer sygnału do nazwania?

Innymi słowy, jeśli mamy makr jak SIGUSR1 -> 12 mamy czegoś takiego 12 -> SIGUSR1?

+3

W moim '/ usr/include/sys/signal.h', wszystkie nazwy sygnałów są po prostu' # define'd constants. Oznacza to, że preprocesor zastąpił je stałymi liczbami całkowitymi do momentu uruchomienia kompilatora - nazwa symboliczna * nie istnieje * w odniesieniu do programu. Co dokładnie próbujesz tutaj zrobić? –

+0

@CarlNorum, nic specjalnego, tylko wyszukane wyjście. Myślałem, że prawdziwe nazwy mogą być przechowywane gdzie indziej, więc mógłbym je zdobyć. –

+0

Jeśli chcesz "fantazyjny wydruk", czy nie jest to dokładnie to, do czego służy 'strsignal'? –

Odpowiedz

10

Moja strona man mówi, że możesz uzyskać nazwy bezpośrednio z tablicy sys_signame. Oto prosty przykład programu pisałem go przetestować:

#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; 
} 

Myślę ten program produkuje wyjście szukasz:

$ ./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 
+2

Wydaje się, że tylko 'strsignal' jest definiowane przez POSIX, wydaje się, że deklaracje tablic jak' sys_signame' wydają się być rozszerzeniem. –

+0

To może równie dobrze być. –

+1

Jest to prawdopodobnie odpowiedź na problem, który OP ma, jeśli jest na OS X, ale nie jest odpowiedzią na pytanie w momencie jego formułowania. –

-1

może być, można zadeklarować globalną tablicę, tak

char *signame[]={"INVALID", "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", "SIGABRT", "SIGBUS", "SIGFPE", "SIGKILL", "SIGUSR1", "SIGSEGV", "SIGUSR2", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGSTKFLT", "SIGCHLD", "SIGCONT", "SIGSTOP", "SIGTSTP", "SIGTTIN", "SIGTTOU", "SIGURG", "SIGXCPU", "SIGXFSZ", "SIGVTALRM", "SIGPROF", "SIGWINCH", "SIGPOLL", "SIGPWR", "SIGSYS", NULL}; 

i można go używać do drukowania nazwy sygnału w obsługi sygnału, jak

void sig_handler(int signum){ 
    printf("Received signal : %s\n", signame[signum]); 
} 
+2

To zły pomysł, ponieważ większość numerów sygnałów zależy od implementacji. SIGKILL ma zawsze 9, ale nie wszystkie sygnały mają ustalone liczby. –

+0

ale dobrze jest używać w obsłudze sygnału, ponieważ strsignal nie jest bezpieczny sygnałowo – SRombauts

Powiązane problemy