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.
La variabile errno La 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 . La sua definizione può includere i qualificatori e/o 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.
Codici di errore standard 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:International Standard for Programming Language C (C99), ISO/IEC 9899:1999, p. 186
Nome DescrizioneEDOM 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.
Storia e controversie 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.
Funzioni correlate 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.
Note
Voci correlate Libreria standard del C Causa legale tra SCO e IBM Gestione degli errori (informatica)
Altri progetti
Collegamenti esterni
Categoria:Libreria standard del C