2013-05-12 13 views
16

Come posso ottenere rapidamente il nome del segnale dal suo numero? C'è strsignal(), ma voglio solo il nome, ad es. SIGUSR1Numero di segnale da nominare?

In altre parole, se abbiamo le macro come SIGUSR1 -> 12 dobbiamo nulla di simile 12 -> SIGUSR1?

+3

In my/usr/include/sys/signal.h', tutti i nomi dei segnali sono solo costanti '# define'd. Ciò significa che il preprocessore li ha già sostituiti con numeri interi costanti al momento dell'esecuzione del compilatore - il nome simbolico * non esiste * per quanto riguarda il programma. Che cosa stai cercando di fare esattamente qui? –

+0

@CarlNorum, niente di speciale, solo un'uscita di fantasia. Pensavo che i nomi attuali potessero essere archiviati da qualche altra parte in modo da poterli ottenere. –

+0

Se vuoi "output di fantasia", non è esattamente ciò che è "strsignal"? –

risposta

10

La pagina man strsignal(3) dice che è possibile ottenere i nomi direttamente dall'array sys_signame. Ecco un semplice esempio di programma che ho scritto per provarlo:

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

Penso che questo programma produce l'output che stai cercando:

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

Sembra che solo 'strsignal' sia definito da POSIX, le dichiarazioni di array come' sys_signame' sembrano essere estensioni. –

+0

Questo potrebbe benissimo essere. –

+1

Quindi questa è forse una risposta al problema che l'OP ha se è su OS X, ma non è una risposta alla domanda così com'è formulata. –

-1

può essere, è possibile dichiarare una matrice globale, come questo

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

e può essere utilizzato per stampare il nome del segnale nel gestore di segnale, come

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

Questa è una cattiva idea perché la maggior parte dei numeri di segnale dipendono dall'implementazione. SIGKILL è sempre 9 ma non tutti i segnali hanno numeri fissi come quello. –

+0

ma è bello da usare in un gestore di segnale poiché strsignal non è sicuro per i segnali – SRombauts

Problemi correlati