我见过Symbolic errno to String - Stack Overflow,所以即使这个问题与bash
有关,我也可以说这不是微不足道的;但只是为了确认:
是否有一个C API函数,像strerror()
一样接受数字errno
作为参数 - 但会打印助记符(例如EINVAL
)而不是错误描述字符串(例如“无效的论证”)?
举个例子,我想
printf("Number: %d (%s): '%s'\n", 22, strerror_mnemonic(22), strerror(22) );
...打印:
Number: 22 (EINVAL): 'Invalid argument'
...其中strerror_mnemonic
是我正在寻找的C函数的伪代码。
答案 0 :(得分:4)
问题的第二部分由strerror
(正如您指出)或更好strerror_r
回答,但在glibc
至少您可以使用%m
作为格式说明符。
第一部分更有趣,即如何获得错误的C常量名称。我相信使用标准glibc
无法做到这一点。你可以构建自己的静态数组或哈希表来相对容易地做到这一点。
答案 1 :(得分:2)
不幸的是没有; E
错误宏没有内省支持。
你可以在Python中轻松地做到这一点:
import errno
print(errno.errorcode[errno.EPERM])
这是因为Python维护者遇到了生成查找表的麻烦:http://hg.python.org/cpython/file/tip/Modules/errnomodule.c
答案 2 :(得分:2)
有什么问题?
perl -ne 'print "$1\n" if /^#\s*define\s+(E[A-Z0-9]+)/' < /usr/include/sys/errno.h | sort | uniq | perl -ne 'chomp; print " { $_, \"$_\" }\n"'
此unix shell命令printa out E*
以/usr/include/sys/errno.h
形式定义{ EINVAL, "EINVAL" },
(其中实际定义为live)。然后你可以将它包装成一个数组:
struct errno_str_t {
int code;
const char *str;
} errnos[] = {
{ EINVAL, "EINVAL" },
...
};
如果需要,可以在运行时按errno值排序。如果您想要可移植(在某种程度上),请考虑将其作为构建过程的一部分。别担心,这是真正的unix方式:)
答案 3 :(得分:1)
你想要strerror(3)。您有时可能会对perror(3)感兴趣。顺便说一下,errno(3)手册页提到了它们。
您可能不需要显示EINVAL
助记符(除非您关心C代码生成)。如果你这样做了,那就为它做一个函数(基本上是switch
语句)。
答案 4 :(得分:1)
以下是将errno
作为助记符返回的函数:
https://paste.ubuntu.com/26170061/
稍后再说。