이름을 지정할 신호 번호?
어떻게 하면 그 번호에서 신호 이름을 빨리 알 수 있습니까?있어strsignal()
SIGUSR1과 같은 이름을 원합니다.
다시 말해서, 만약 우리가 다음과 같은 매크로를 가지고 있다면.SIGUSR1 -> 12
우리에게 비슷한 것이 있습니까?12 -> SIGUSR1
?
내 남자 페이지에 따르면 당신은 그 이름들을 직접 얻을 수 있다고 합니다.sys_signame
여기 테스트를 위해 작성한 간단한 예제 프로그램이 있습니다.
#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;
}
이 프로그램은 당신이 원하는 결과물을 만들어냅니다.
$ ./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
glib 2.32 (2020-08-05 출시) 기능을 도입했습니다.sigabbrev_np(int)
그 버전 이후로 당신은 사용할 수 없습니다.sys_siglist[]
더 이상도.
부터man strsignal
:
그
sigabbrev_np()
function은 신호의 약식 이름인 sig를 반환합니다.예를 들어, 주어진 값SIGINT
문자열을 반환합니다."INT"
.
[...]
sigdescr_npx와 sigdabbrev_npx는 glibc 2.32에서 처음 등장했습니다.버전 2.32부터 sys_siglist 기호는 더 이상 glibc에서 내보내지 않습니다.
릴리스 정보:
함수
sigabbrev_np
그리고.sigdescr_np
추가되었습니다.sigabbrev_np
약식 신호 이름을 반환합니다(예:"HUP"
위해서SIGHUP
) [...] 두 기능 모두 잘못된 신호 번호에 대해 NULL을 반환합니다.그것들은 대신에 사용되어야 합니다.
sys_siglist
또는sys_sigabbrev
스레드와 비동기식 모두 안전합니다.이러한 함수는 GNU 확장입니다.
몇 년 전 Jens Gustedt가 코멘트에서 지적했듯이, sys_signame과 sys_siglist는 이식할 수 없습니다.
이 질문에는 태그가 지정되어 있으므로[unix]
당신은 아마 할 수 있을 겁니다.#ifdef
사용자 환경에 맞는 이름과 숫자 값을 매핑하는 방법.다음과 같은 것:
//
// const char * signame(int s)
//
// return the name of the given signal number as a string,
// or NULL if the number is unrecognized.
//
#define _POSIX_C_SOURCE 200809L
#include <signal.h>
#define SIGNAMEANDNUM(s) { #s, s }
static struct {
const char *name,
int value,
} known_signals[] = {
SIGNAMEANDNUM(SIGABRT), // get the POSIX signals
SIGNAMEANDNUM(SIGALRM),
SIGNAMEANDNUM(SIGBUS),
SIGNAMEANDNUM(SIGCHLD),
/* ... */
SIGNAMEANDNUM(SIGXFSZ),
#ifdef SIGUNUSUAL // get nonstandard signals
SIGNAMEANDNUM(SIGUNUSUAL),
#endif
/* ... */
};
const char *
signame(int s) {
const char *name = NULL;
for (int i = 0; i < sizeof(known_signals)/sizeof(*known_signals); i++) {
if (s == known_signals[i].value) {
name = known_signals[i].name;
break;
}
}
return name;
}
물론 플랫폼에 대한 사전 지식이 필요합니다.
Ubuntu 16.04 및 MIPS에서 아래 코드로 테스트되었으며 정상적으로 작동합니다.
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
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;
}
Ubuntu-16.04(Intel x86_64 GNU/리눅스)에서 위 코드의 출력은 다음과 같습니다.
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
비지박스(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
다음과 같이 글로벌 어레이를 선언할 수 있습니다.
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};
그리고 신호 처리기에서 신호 이름을 인쇄하는 데 사용할 수 있습니다.
void sig_handler(int signum){
printf("Received signal : %s\n", signame[signum]);
}
언급URL : https://stackoverflow.com/questions/16509614/signal-number-to-name
'prosource' 카테고리의 다른 글
mysql 정렬 문자열 번호 (0) | 2023.07.27 |
---|---|
$_SERVER["REMOTE_ADDR"]는 방문자 IP가 아닌 서버 IP를 제공합니다. (0) | 2023.07.27 |
SQL 문에 스프링 부트 최대 절전 모드 구문 오류가 있음 (0) | 2023.07.27 |
Angular 4 확인란 값 변경 (0) | 2023.07.27 |
Node.js의 메모리 사용량을 모니터링하는 방법은 무엇입니까? (0) | 2023.07.27 |