Barrel Bagwell Asked: 2021-10-14 09:11:52 +0800 CST2021-10-14 09:11:52 +0800 CST 2021-10-14 09:11:52 +0800 CST 如何将程序的退出状态转换为信号名称 772 pid_t waitpid(pid_t pid, int *status, int options); 比如status=2,返回字符串“SIGINT”,status=11,返回字符串“SIGSEGV”。是否有一个内置的 c 函数可以接收状态并输出信号名称? linux signals 2 个回答 Voted Vojtech Trefny 2021-10-14T10:08:02+08:002021-10-14T10:08:02+08:00 如果您有 glibc 2.32 或更新版本,您可以使用sigabbrev_np: sigabbrev_np() 函数返回信号的缩写名称,sig。例如,给定值 SIGINT,它返回字符串“INT”。 所以你只需要预先SIG获取SIGINT. Best Answer ilkkachu 2021-10-14T10:11:13+08:002021-10-14T10:11:13+08:00 与 类似strerror(n),还有strsignal(n),它给出了详细的名称,例如 SIGINT -> "Interrupt"。但这不是你真正想要的。 Stackoverflow 上的这个答案表明sigabbrev_np()glibc 2.32 中应该可以使用: https 信号缩写以及错误编号缩写是预处理器已知的,因此您可以手动构建一个列表,如代码审查上的此答案: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,请查看手册页以获取信号列表。这些数字在不同的架构之间打乱,存在的信号也略有不同,但您可以从那里获得名称列表。
如果您有 glibc 2.32 或更新版本,您可以使用
sigabbrev_np
:所以你只需要预先
SIG
获取SIGINT
.与 类似
strerror(n)
,还有strsignal(n)
,它给出了详细的名称,例如 SIGINT -> "Interrupt"。但这不是你真正想要的。Stackoverflow 上的这个答案表明
sigabbrev_np()
glibc 2.32 中应该可以使用: https信号缩写以及错误编号缩写是预处理器已知的,因此您可以手动构建一个列表,如代码审查上的此答案:https ://codereview.stackexchange.com/a/252825/111089
在那里处理代码以减少
#
预处理器运算符的重复,该程序将通过数字知道一些信号的名称:它给出了例如:
这里的问题是找出所有的名字来填写表格......
为此,一种选择是让编译器转储它知道的定义,例如:
然后使用脚本来构建一些有用的东西。请注意,也可能有这样的条目:
而且我不确定实时信号是否在任何地方都有单独的定义,或者它们是否只是
SIGRTMIN+0
,SIGRTMIN+1
等SIGRTMAX
。或者,至少如果您使用的是 Linux,请查看手册页以获取信号列表。这些数字在不同的架构之间打乱,存在的信号也略有不同,但您可以从那里获得名称列表。