errno.h
errno.h è un header file della libreria standard del linguaggio di programmazione C che contiene definizioni di macro per ottenere informazioni sulle condizioni in cui si verificano degli errori. Ciò avviene mediante l'utilizzo della variabile errno
(abbreviazione inglese di "error number").
errno
agisce come variabile globale intera definita da errno.h
. Un valore (il numero dell'errore) è memorizzato in errno
da certe funzioni di libreria quando individuano un errore per segnalare specifiche situazioni. All'avvio del programma, tale valore viene impostato a 0 ed è garantito che nessuna funzione di libreria lo azzeri. Le funzioni di libreria memorizzano solamente valori maggiori di 0. Qualsiasi funzione di libreria può modificare a piacimento errno
prima di ritornare, sia che si sia verificato un errore, sia altrimenti.[1] Alcune funzioni richiedono che sia il chiamante a pre-impostare errno
a zero. La maggior parte delle funzioni di libreria segnalano un errore ritornando specifici valori, tipicamente NULL per funzioni ritornanti i puntatori, e -1 per funzioni che ritornano interi. È buona prassi azzerare errno
prima di chiamare funzioni di libreria, controllare il loro valore di ritorno subito dopo averle chiamate e qualora fosse presente uno dei valori appena citati, gestire opportunamente l'errore impostato dal chiamato in errno.h
. In caso di errori presente in chiamate di funzioni successive, il precedente errore salvato verrà sovrascritto.
errno
macro si espande in un lvalue con tipo int
, qualche volta con extern
e/o volatile
a seconda della piattaforma.[2] Originariamente questa era una zona di memoria statica, ma la maggioranza delle macro, oggi, sono utilizzate in contesti multi-threaded, quindi ogni thread avrà il suo errno
nel thread stack.
Il file di header definisce anche macro che si espandono a interi costanti che rappresentano I codici di errore. La libreria standard del C richiede solamente che i seguenti tre siano definiti:[1]
Nome | Descrizione |
---|---|
EDOM |
Costante intera positiva che indica un errore di dominio di una funzione, come in sqrt(-1) .
|
EILSEQ |
Costante intera positiva che indica una sequenza illegale di byte su sistemi che usano UTF-8. |
ERANGE |
Costante intera positiva che indica un risultato troppo grande o piccolo e pertanto non rappresentabile sulla microarchitettura corrente. |
Altri sistemi operativi (abbreviato in SO, in inglese OS) conformi a POSIX, come Unix o Linux, potrebbero includere altre macro per rappresentare ulteriori situazioni di errore (vedere anche i collegamenti esterni), spesso più comuni delle precedenti. Un esempio è EACCES che si verifica quando un file non può essere aperto in lettura.
Il 19 dicembre 2003, lo SCO Group citò in giudizio svariate aziende (incluse in Fortune 1000 e Global 500) ritenendo che parti del kernel di Unix, tra cui il file errno.h
, fossero state illecitamente riprodotte nei sorgenti di Linux. Linus Torvalds, il creatore e detentore del marchio registrato Linux, ha negato le pretese della SCO, affermando di aver scritto di proprio pugno il codice in questione.
Tradizionalmente, la prima pagina del manuale di sistema Unix, chiamata intro(2), elenca tutte le errno.h
macro, ma questo non è il caso di Linux, dove queste macro sono invece elencate in errno(3).
Un valore errno
può essere tradotto in una stringa descrittiva usando sterror
, (definita in string.h). Tale traduzione può essere stampata direttamente sullo stderr con perror
(definita in stdio.h). Come strerror
in alcuni sistemi Unix-like non è thread-safe, una versione che lo è strerror_r
viene utilizzata, ma con definizione contrastanti tra POSIX e GNU la rendono meno portabile.[3]
Note
modifica- ^ a b International Standard for Programming Language C (C99), ISO/IEC 9899:1999, p. 186
- ^ Checking for Errors, su The GNU C Library (glibc), GNU Project, 8 febbraio 2014. URL consultato il 25 giugno 2014.
- ^ Colin McCabe, The problem with strerror, su club.cc.cmu.edu.
Voci correlate
modificaAltri progetti
modificaCollegamenti esterni
modifica- (EN) Le specifiche dell'Open Group per errno.h, su opengroup.org.
- (EN) Commento di Linus Torvalds su errno.h, su ussg.iu.edu. URL consultato il 1º settembre 2006 (archiviato dall'url originale il 14 dicembre 2012).
- (EN) Commento sulla lettera dello SCO Group, compresa una storia dettagliata di errno.h, su healconsulting.com. URL consultato il 1º settembre 2006 (archiviato dall'url originale il 6 settembre 2009).
- (EN) Warren Toomey della UNIX Heritage Society ricostruisce la storia di errno.h in Unix e Linux, su groklaw.net.