프로그램의 종료 상태를 신호 이름으로 변환하는 방법

프로그램의 종료 상태를 신호 이름으로 변환하는 방법
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.

관련 정보