我已经看到符号errnostring – 堆栈溢出 ,所以即使这个问题是bash
相关的,我已经可以告诉这不是微不足道的; 但只是为了确认:
是否有一个C API函数,像strerror()
将接受数字errno
作为参数 – 但将打印助记符(如EINVAL
),而不是错误描述string(如“无效参数”)?
作为一个例子,我想
printf("Number: %d (%s): '%s'\n", 22, strerror_mnemonic(22), strerror(22) );
… 打印:
Number: 22 (EINVAL): 'Invalid argument'
… strerror_mnemonic
是我正在寻找C函数的伪代码。
不幸的是, E
错误宏没有反省支持。
你可以在Python中轻松地做到这一点:
import errno print(errno.errorcode[errno.EPERM])
这是因为Python维护者遇到了生成查找表的麻烦: http : //hg.python.org/cpython/file/tip/modulees/errnomodule.c
你的问题的第二部分是由strerror
(正如你指出的那样)或更好的strerror_r
来回答的,但是在glibc
中至少可以简单地使用%m
作为格式说明符。
第一部分是更有趣的,即你如何得到错误的C常数的名称。 我相信有没有办法使用标准的glibc
做到这一点。 你可以构造你自己的静态数组或哈希表来做到这一点相对容易。
你想strerror(3) 。 (3)你有时可能会感兴趣。 顺便说一句, 错误(3)手册页提到他们。
您可能不需要显示EINVAL
助记符(除非您关心C代码生成)。 如果你这样做,做一个函数(本质上,一个switch
语句)。
有什么问题?
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命令打印出来的E*
以/usr/include/sys/errno.h
(其中实际定义的实体)的格式{ EINVAL, "EINVAL" },
。 然后你可以把它包装成一个数组:
struct errno_str_t { int code; const char *str; } errnos[] = { { EINVAL, "EINVAL" }, ... };
如果需要,可以在运行时通过errno值进行排序。 如果你想要移植(在某种程度上),可以考虑将其作为构建过程的一部分。 不要担心,这是这样做的真正unix方式:)