strerror
risponde alla seconda parte della tua domanda (come fai notare), o meglio strerror_r
, ma in glibc
almeno puoi semplicemente usare %m
come identificatore di formato.
La prima parte è più interessante, ovvero come si ottiene il nome della costante C per l'errore. Credo che non ci sia modo di farlo usando lo standard glibc
. Potresti costruire il tuo array statico o tabella hash per farlo in modo relativamente semplice.
Sfortunatamente no; non c'è supporto per l'introspezione per il E
macro di errore.
Puoi farlo banalmente in Python:
import errno
print(errno.errorcode[errno.EPERM])
Questo perché i manutentori di Python si sono presi la briga di generare una tabella di ricerca:http://hg.python.org/cpython/file/tip/Modules/errnomodule.c
Qual è il 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"'
Questo comando shell unix stampa E*
definisce da /usr/include/sys/errno.h
(dove actual definisce live) nella forma { EINVAL, "EINVAL" },
. Puoi quindi avvolgerlo in un array:
struct errno_str_t {
int code;
const char *str;
} errnos[] = {
{ EINVAL, "EINVAL" },
...
};
E ordina per valore errno in fase di esecuzione, se necessario. Se vuoi essere portatile (in una certa misura), considera di renderlo parte del processo di compilazione. Non preoccuparti, questo è il vero modo unix di farlo :)