打印errno作为助记符?

时间:2014-02-24 17:42:54

标签: c linux

我见过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函数的伪代码。

5 个答案:

答案 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/

稍后再说。