pid_t waitpid(pid_t pid, int *status, int options);
예를 들어, status=2이면 "SIGINT" 문자열이 반환되고, status=11이면 "SIGSEGV" 문자열이 반환됩니다. 상태를 수신하고 신호 이름을 출력하는 내장 c 함수가 있습니까?
답변1
strerror(n)
와 유사하게 strsignal(n)
SIGINT -> "Interrupt"와 같은 자세한 이름을 제공합니다. 하지만 그것은 실제로 당신이 원하는 것이 아닙니다.
Stackoverflow에 대한 이 답변은 sigabbrev_np()
glibc 2.32에서 사용할 수 있음을 시사합니다.
https://stackoverflow.com/a/68481682/6372809
전처리기는 신호 약어와 오류 번호 약어를 알고 있으므로 코드 검토에서 다음 답변에 표시된 대로 목록을 수동으로 작성할 수 있습니다.https://codereview.stackexchange.com/a/252825/111089
전처리기 연산자의 중복을 줄이기 위한 코드 작업을 통해
#
프로그램은 일부 신호의 이름을 숫자로 알 수 있습니다.
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define init_signame(x) [x] = #x
static const char *signames[] = {
init_signame(SIGINT),
init_signame(SIGSTOP),
init_signame(SIGTERM),
init_signame(SIGKILL),
init_signame(SIGHUP),
[0] = ""
};
const char *getsig(int sig) {
if (sig <= 0 || sig >= sizeof(signames) / sizeof(*signames) || !signames[sig])
return "UNKN";
return signames[sig];
}
int main(int argc, char *argv[])
{
int i = 0;
if (argc > 1) {
i = atoi(argv[1]);
}
printf("%d = %s = %s\n", i, getsig(i), strsignal(i));
}
예를 들어 다음과 같습니다.
$ ./signame2 1
1 = SIGHUP = Hangup
여기서 문제는 양식을 채우는 모든 이름을 찾는 것입니다.
이에 대한 한 가지 옵션은 컴파일러가 알고 있는 정의를 덤프하도록 하는 것입니다. 예:
$ gcc -dM -E - <<< '#include <signal.h>' |grep -E '#define SIG[A-Z]+ '
#define SIGBUS 7
#define SIGTTIN 21
#define SIGTTOU 22
...
그런 다음 스크립트를 사용하여 유용한 것을 작성하십시오. 다음과 같은 항목이 있을 수도 있습니다.
#define SIGCLD SIGCHLD
#define SIGRTMAX (__libc_current_sigrtmax ())
SIGRTMIN+0
라이브 신호가 어디서든 별도의 정의를 가지고 있는지, 아니면 기껏해야 , SIGRTMIN+1
등인지 잘 모르겠습니다 SIGRTMAX
.
또는 적어도 Linux를 사용하는 경우 확인하십시오.매뉴얼 페이지신호 목록을 가져옵니다. 숫자는 서로 다른 아키텍처 간에 섞여 있으며 존재하는 신호는 약간 다르지만 거기에서 이름 목록을 얻을 수 있습니다.
답변2
glibc 2.32 이상이면 다음을 사용할 수 있습니다.sigabbrev_np
:
sigabbrev_np() 함수는 신호의 약식 이름인 sig를 반환합니다. 예를 들어, SIGINT 값이 주어지면 문자열 "INT"가 반환됩니다.
SIG
따라서 그것을 얻으려면 접두어만 붙이면 됩니다 SIGINT
.