errno.h è un header file della libreria standard nel linguaggio di programmazione C che contiene definizioni di macro per ricevere informazioni sulle condizioni in cui si verificano degli errori. Ciò avviene mediante l'utilizzo della variabile errno
.
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 valore di ritorno delle funzioni 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 conformi a POSIX, come Unix o Linux, potrebbero includere altre macro per rappresentare ulteriori situazioni di errore, 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 inviata 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]