La deuxième partie de votre question est répondue par strerror
(comme vous le soulignez), ou mieux strerror_r
, mais en glibc
au moins vous pouvez simplement utiliser %m
comme spécificateur de format.
La première partie est plus intéressante, c'est-à-dire comment obtenez-vous le nom de la constante C pour l'erreur. Je crois qu'il n'y a aucun moyen de le faire en utilisant la norme glibc
. Vous pouvez construire votre propre tableau statique ou table de hachage pour le faire relativement facilement.
Malheureusement non; il n'y a pas de support d'introspection pour le E
macros d'erreur.
Vous pouvez le faire trivialement en Python :
import errno
print(errno.errorcode[errno.EPERM])
C'est parce que les responsables de Python se sont donné la peine de générer une table de recherche :http://hg.python.org/cpython/file/tip/Modules/errnomodule.c
Quel est le problème ?
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"'
Cette commande shell unix affiche E*
définit à partir de /usr/include/sys/errno.h
(où réel définit vivre) sous la forme { EINVAL, "EINVAL" },
. Vous pouvez ensuite l'envelopper dans un tableau :
struct errno_str_t {
int code;
const char *str;
} errnos[] = {
{ EINVAL, "EINVAL" },
...
};
Et trier par valeur errno lors de l'exécution si nécessaire. Si vous voulez être portable (dans une certaine mesure), envisagez d'en faire une partie du processus de construction. Ne vous inquiétez pas, c'est la vraie façon Unix de faire ça :)