Errno.h
| Tipus | C header file (en) |
|---|---|
| Part de | C standard library, Biblioteca C POSIX i Biblioteca estàndard de C++ |
| Característiques tècniques | |
| Plataforma | C standard library |
errno.h és un fitxer de capçalera de la biblioteca estàndard del llenguatge de programació C. Defineix macros per informar i recuperar condicions d'error utilitzant el símbol errno (abreviatura de "número d'error").
errno actua com una variable entera. Un valor (el número d'error) s'emmagatzema a errno per determinades funcions de la biblioteca quan detecten errors. A l'inici del programa, el valor emmagatzemat és zero. Les funcions de biblioteca només emmagatzemen valors superiors a zero. Qualsevol funció de biblioteca pot alterar el valor emmagatzemat abans del retorn, independentment que detecti errors o no. La majoria de les funcions indiquen que van detectar un error retornant un valor especial, normalment NULL per a funcions que retornen punters i -1 per a funcions que retornen nombres enters. Algunes funcions requereixen que la persona que truca preestableixi errno a zero i el provi després per veure si s'ha detectat un error.
La macro errno s'expandeix a un lvalue amb el tipus int, de vegades amb els especificadors de tipus extern i/o volatile depenent de la plataforma.[1] Originalment es tractava d'una ubicació de memòria estàtica, però avui dia s'utilitzen gairebé sempre les macros per permetre el multi-threading, de manera que cada fil veurà el seu propi número d'error local del fil.
El fitxer de capçalera també defineix macros que s'expandeixen a constants senceres que representen els codis d'error. La biblioteca estàndard C només requereix que se'n defineixin tres:
EDOM
- Resultats d'un paràmetre fora del domini d'una funció, p. ex.
sqrt(-1)
ERANGE
- Resultats d'un resultat fora de l'interval d'una funció, per exemple,
strtol("0xfffffffff", NULL, 0)en sistemes amb unalongde 32 bits
EILSEQ (obligatori des de l'esmena 1 de l'estàndard C89 de 1994)[2]
Resultats d'una seqüència de bytes il·legal, per exemple, mbstowcs(buf, "\xff", 1) en sistemes que utilitzen UTF-8.
Els sistemes operatius compatibles amb POSIX com AIX, Linux o Solaris inclouen molts altres valors d'error, molts dels quals s'utilitzen molt més sovint que els anteriors, com ara EACCES quan no es pot obrir un fitxer per llegir-lo. C++11 també defineix molts dels mateixos valors que es troben a l'especificació POSIX.[3]
Tradicionalment, la primera pàgina dels manuals del sistema Unix, anomenada intro(2), enumera totes les macros errno.h, però aquest no és el cas de Linux, on aquestes macros s'enumeren a l'errno(3).[4]
Un errno es pot traduir a una cadena descriptiva utilitzant strerror (definit a string.h) o una extensió BSD anomenada sys_errlist. La traducció es pot imprimir directament al flux d'error estàndard utilitzant perror (definit a stdio.h). Com que strerror en molts sistemes semblants a Unix no és segur per a threads, s'utilitza una versió segura per a threads strerror_r, però les definicions conflictives de POSIX i GNU la fan encara menys portàtil que la taula sys_errlist.[5]
Referències
[modifica]- ↑ «Checking for Errors» (en anglès). The GNU C Library (glibc). GNU Project, 08-02-2014. [Consulta: 25 juny 2014].
- ↑ «A brief description of Normative Addendum 1» (en anglès). [Consulta: 12 setembre 2013].
- ↑ «Error numbers - cppreference.com». anglès. [Consulta: 8 maig 2015].
- ↑ Stevens i Rago, 2013, p. 14.
- ↑ McCabe, Colin. «The problem with strerror» (en anglès). www.club.cc.cmu.edu.