tuberias tag songs sigusr1 sigalrm señales reggaeton programacion procesos proceso preguntas nombre lenguaje las entre comunicacion challenge canciones alarma c unix

c - songs - tag de las 20 preguntas



¿Número de señal a nombre? (2)

¿Cómo puedo obtener rápidamente el nombre de la señal de su número? Hay strsignal() , pero solo quiero el nombre, por ejemplo, SIGUSR1

En otras palabras, si tenemos macros como SIGUSR1 -> 12 ¿tenemos algo como 12 -> SIGUSR1 ?


Mi página de strsignal(3) dice que puede obtener los nombres directamente de la matriz sys_signame . Aquí hay un programa de ejemplo simple que escribí para probarlo:

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

Creo que este programa produce la salida que estás buscando:

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


Puede ser, puedes declarar una matriz global, como esta

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

y puede usarlo para imprimir el nombre de la señal en el controlador de señales, como

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