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
?
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
?
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
Wydaje się, że tylko 'strsignal' jest definiowane przez POSIX, wydaje się, że deklaracje tablic jak' sys_signame' wydają się być rozszerzeniem. –
To może równie dobrze być. –
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. –
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]);
}
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. –
ale dobrze jest używać w obsłudze sygnału, ponieważ strsignal nie jest bezpieczny sygnałowo – SRombauts
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ć? –
@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ć. –
Jeśli chcesz "fantazyjny wydruk", czy nie jest to dokładnie to, do czego służy 'strsignal'? –