C-Bibliotheksmakro -errno
C-Standardbibliothek - <errno.h>
Beschreibung
C-Bibliotheksmakroextern int errnowird von Systemaufrufen gesetzt, und bestimmte Bibliotheksfunktionen geben bei Fehlerereignissen an, welcher Fehler aufgetreten ist.
errnoist ein Makro in der C-Standardbibliothek, definiert in<errno.h>In der Header-Datei. Es wird verwendet, um Fehler anzugeben, die während der Programmausführung auftreten.errnoist tatsächlich eine Integer-Variable, die zum Speichern von Fehlercodes verwendet wird. Wenn Bibliotheksfunktionen auf einen Fehler stoßen, setzen sieerrnoauf einen geeigneten Fehlercode, damit das Programm diese Fehler überprüfen und behandeln kann.
Deklaration
Nachfolgend finden Sie die Deklaration des errno-Makros.
extern int errno
Parameter
- N/V
Rückgabewert
- N/V
NutzungerrnoSchritte
- Header-Dateien einbinden: Bei Verwendung von
errnoVorher muss es einbinden<errno.h>Header-Datei. - Funktion aufrufen: Der Aufruf kann setzen
errnoder Funktion. - Prüft
errno: Wenn die Funktion zurückkehrt und einen Fehler anzeigt, prüfen Sieerrno, um den Fehlertyp zu erhalten. - Fehler behandeln: Gemäß
errnoWert, und ergreifen Sie geeignete Maßnahmen zur Fehlerbehandlung.
Beispiel
Das folgende Beispiel demonstriert die Verwendung des errno-Makros.
Beispiel
Lassen Sie uns das obige Programm kompilieren und ausführen, wenn die Dateifile.txtWenn sie nicht existiert, werden die folgenden Ergebnisse auftreten:
Value of errno: 2 Error opening file: No such file or directory
HäufigerrnoWert
EPERM: Operation nicht erlaubtENOENT: Datei oder Verzeichnis nicht gefundenESRCH: Kein solcher ProzessEINTR: Unterbrochener SystemaufrufEIO: Eingabe-/AusgabefehlerENXIO: Kein solches Gerät oder AdresseE2BIG: Argumentliste zu langENOMEM: Nicht genügend SpeicherEACCES: Zugriff verweigertEFAULT: Ungültige AdresseEBUSY: Ressource belegtEEXIST: Datei existiert bereitsEXDEV: Geräteübergreifender LinkENODEV: Kein solches GerätENOTDIR: Kein VerzeichnisEISDIR: Ist ein VerzeichnisEINVAL: Ungültiges ArgumentENFILE: Überlauf der SystemdateitabelleEMFILE: Zu viele offene DateienENOTTY: Kein TerminalgerätETXTBSY: Textdatei ist belegtEFBIG: Datei zu großENOSPC: Kein Speicherplatz mehr auf dem GerätESPIPE: Unzulässige AdressierungEROFS: Nur-Lese-DateisystemEMLINK: Zu viele VerknüpfungenEPIPE: Unterbrochene Pipe
Hinweise
- Thread-Sicherheit: In einer Multithreading-Umgebung,
errnowird normalerweise als Thread-lokaler Speicher (TLS) implementiert, wodurch sichergestellt wird, dass jeder Thread einen unabhängigenerrnoWert. - Initialwert: Wenn der Funktionsaufruf erfolgreich ist,
errnowird normalerweise nicht geändert. Daher sollten Sie vor der Fehlerbehandlung sicherstellen,errnoauf 0 gesetzt wird. - Plattformübergreifende Unterschiede: Verschiedene Betriebssysteme und Implementierungen der C-Standardbibliothek können zusätzliche Fehlercodes definieren. Programme sollten vermeiden, sich auf die numerischen Werte bestimmter Fehlercodes zu verlassen.
Vorschläge zur Fehlerbehandlung
- Rückgabewert prüfen: Prüfen Sie beim Aufruf von Funktionen, die fehlschlagen können, immer deren Rückgabewert.
- Einstellungen
errnoist 0: Vor dem Aufruf der Funktion können Sieerrnoauf 0 setzen, sodass Sie nach dem Funktionsaufruf prüfen können,errnoob er geändert wurde. - Nutzung
strerrorundperror:strerrorDie Funktion wirderrnoin eine lesbare Fehlermeldungszeichenfolge umwandeln;perrorFunktion gibt den errno-Wert mit einer beschreibenden Fehlermeldung aus.errnoWert.
Detaillierte Fehlerbehandlung
Nachfolgend ein detaillierteres Beispiel, das zeigt, wie man verschiedene behandelterrnoWert:
Beispiel
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
switch (errno) {
case EACCES:
printf("Fehler: Zugriff verweigert\n");
break;
case ENOENT:
printf("Fehler: Datei oder Verzeichnis nicht vorhanden\n");
break;
default:
printf("Fehler beim Öffnen der Datei: %s\n", strerror(errno));
}
return 1;
}
// Dateiverarbeitungscode
fclose(file);
return 0;
}
In diesem Beispiel haben wir den spezifischenerrnoWert geprüft und entsprechend behandelt. WennerrnoJaEACCES(Permission denied) oderENOENT(No such file or directory), geben wir eine spezifische Fehlermeldung aus; andernfalls geben wir eine generische Fehlermeldung aus.
<errno.h>bietet eine standardisierte Möglichkeit, Fehler in Programmen zu melden und zu behandeln, wodurch der Fehlerbehandlungscode konsistenter und wartbarer wird.