La segunda parte de su pregunta es respondida por strerror
(como tú señalas), o mejor strerror_r
, pero en glibc
al menos puedes simplemente usar %m
como especificador de formato.
La primera parte es más interesante, es decir, ¿cómo se obtiene el nombre de la constante C para el error? Creo que no hay forma de hacerlo usando glibc
estándar . Puede construir su propia matriz estática o tabla hash para hacer esto con relativa facilidad.
Lamentablemente no; no hay soporte de introspección para el E
macros de error.
Puedes hacer esto trivialmente en Python:
import errno
print(errno.errorcode[errno.EPERM])
Esto se debe a que los mantenedores de Python se han tomado la molestia de generar una tabla de búsqueda:http://hg.python.org/cpython/file/tip/Modules/errnomodule.c
¿Cuál es el problema?
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"'
Este comando de shell de Unix imprime E*
define desde /usr/include/sys/errno.h
(donde actual define en vivo) en forma { EINVAL, "EINVAL" },
. Luego puede envolverlo en una matriz:
struct errno_str_t {
int code;
const char *str;
} errnos[] = {
{ EINVAL, "EINVAL" },
...
};
Y ordenar por valor errno en tiempo de ejecución si es necesario. Si desea que sea portátil (hasta cierto punto), considere hacerlo parte del proceso de compilación. No te preocupes, esa es la verdadera forma Unix de hacer esto :)