errno.h è un header file della libreria standard nel linguaggio C. Questo file definisce macro e tipi per la gestione e la segnalazione delle condizioni di errore che possono verificarsi durante l'esecuzione delle funzioni di libreria. La gestione degli errori avviene principalmente tramite l'utilizzo della variabile globale errno.
errnoLa variabile errno è una variabile intera globale, definita nell'header file errno.h. Essa è utilizzata dalle funzioni della libreria standard del C per memorizzare un codice di errore quando viene rilevata una condizione anomala o un fallimento dell'operazione.
All'avvio del programma, il valore di errno è impostato a zero e, secondo lo standard C, nessuna funzione di libreria è garantita azzerarlo. Le funzioni di libreria memorizzano in errno solamente valori interi positivi, indicando un errore specifico. È importante notare che una funzione di libreria può modificare il valore di errno prima di ritornare, indipendentemente dal fatto che si sia verificato un errore o meno. Per questo motivo, la buona prassi di programmazione raccomanda di azzerare esplicitamente errno prima di invocare una funzione di libreria e di controllare il valore di ritorno della funzione immediatamente dopo la sua chiamata. Se il valore di ritorno indica un errore (tipicamente NULL per funzioni che restituiscono puntatori, o -1 per funzioni che restituiscono interi), allora si può consultare errno per determinare la causa specifica dell'errore. In caso di chiamate successive a funzioni di libreria, il valore precedente memorizzato in errno verrà sovrascritto.
La macro errno si espande in un lvalue di tipo int. La sua definizione può includere i qualificatori extern e/o volatile a seconda della piattaforma e dell'implementazione. Storicamente, errno era una variabile situata in una zona di memoria statica. Tuttavia, in contesti multi-thread, la maggior parte delle implementazioni moderne la rendono "thread-local", ovvero ogni thread avrà una propria copia di errno nel suo stack o in una memoria dedicata al thread, garantendo che le operazioni su errno siano thread-safe e non interferiscano tra i thread.
L'header file errno.h definisce anche macro che si espandono in costanti intere positive, ciascuna rappresentante un codice di errore specifico. Lo standard C (C99 e successivi) richiede che siano definite almeno le seguenti tre macro:
| Nome | Descrizione |
|---|---|
EDOM | Costante intera positiva che indica un errore di dominio per una funzione matematica, come nel caso del calcolo della radice quadrata di un numero negativo (sqrt(-1)), per la quale la funzione non è definita nel dominio dei numeri reali. |
EILSEQ | Costante intera positiva che segnala una sequenza di byte illegale o non valida. Questo errore si verifica tipicamente su sistemi che gestiscono sequenze di caratteri multi-byte (come UTF-8), quando viene incontrata una sequenza non riconosciuta o malformata. |
ERANGE | Costante intera positiva che indica un errore di intervallo, ovvero un risultato troppo grande (overflow) o troppo piccolo (underflow) per essere rappresentato nel tipo di dato di ritorno o sulla microarchitettura corrente. |
Altri sistemi operativi conformi a POSIX, come Unix o Linux, estendono questo set di codici di errore, includendo un numero maggiore di macro per rappresentare situazioni di errore più comuni e specifiche del sistema. Un esempio tipico è `EACCES`, che si verifica quando un'operazione su un file (come l'apertura in lettura o scrittura) viene negata a causa di permessi insufficienti.
Tradizionalmente, sui sistemi Unix, la prima pagina del manuale di sistema (man page) relativa alle chiamate di sistema (sezione 2), intitolata `intro(2)`, elenca tutte le macro definite in `errno.h`. Questo non è il caso specifico di Linux, dove queste macro sono invece documentate nella sezione 3 del manuale, sotto la pagina `errno(3)`.
Il 19 dicembre 2003, lo SCO Group avviò azioni legali contro svariate aziende (incluse tra le Fortune 1000 e Global 500), sostenendo 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 pubblicamente negato le pretese dello SCO, affermando di aver scritto personalmente il codice in questione o che esso derivasse da fonti legittime e non proprietarie. La controversia legale tra SCO e IBM, che coinvolse anche il codice di `errno.h`, si protrasse per anni, con esiti complessi che non diedero ragione a SCO sulla maggior parte delle sue pretese principali.
Per la gestione e la visualizzazione dei messaggi di errore associati a errno, la libreria standard del C fornisce due funzioni principali:
strerror: definita in string.h, questa funzione accetta un codice di errore (come quelli memorizzati in errno) e lo traduce in una stringa descrittiva leggibile dall'utente.perror: definita in stdio.h, questa funzione invia direttamente un messaggio di errore formattato allo stream di errore standard (`stderr`). Il messaggio include una stringa fornita dal programmatore, seguita da un due punti e dalla descrizione testuale dell'errore corrispondente al valore corrente di errno.È importante notare che, in alcuni sistemi Unix-like più datati, l'implementazione di strerror potrebbe non essere thread-safe, il che significa che il suo utilizzo in ambienti multithreading potrebbe portare a condizioni di gara. Per ovviare a questo problema, è stata introdotta la versione thread-safe strerror_r. Tuttavia, la definizione di strerror_r presenta differenze incompatibili tra lo standard POSIX e l'implementazione GNU, rendendola meno portabile tra i diversi sistemi.