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

  1. Header-Dateien einbinden: Bei Verwendung vonerrnoVorher muss es einbinden<errno.h>Header-Datei.
  2. Funktion aufrufen: Der Aufruf kann setzenerrnoder Funktion.
  3. Prüfterrno: Wenn die Funktion zurückkehrt und einen Fehler anzeigt, prüfen Sieerrno, um den Fehlertyp zu erhalten.
  4. Fehler behandeln: GemäßerrnoWert, und ergreifen Sie geeignete Maßnahmen zur Fehlerbehandlung.

Beispiel

Das folgende Beispiel demonstriert die Verwendung des errno-Makros.

Beispiel

#include <stdio.h> #include <errno.h> #include <string.h> extern int errno ; int main () { FILE *fp; fp = fopen("file.txt", "r"); if( fp == NULL ) { fprintf(stderr, "Wert von errno: %d\n", errno); fprintf(stderr, "Fehler beim Öffnen der Datei: %s\n", strerror(errno)); } else { fclose(fp); } return(0); }

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 erlaubt
  • ENOENT: Datei oder Verzeichnis nicht gefunden
  • ESRCH: Kein solcher Prozess
  • EINTR: Unterbrochener Systemaufruf
  • EIO: Eingabe-/Ausgabefehler
  • ENXIO: Kein solches Gerät oder Adresse
  • E2BIG: Argumentliste zu lang
  • ENOMEM: Nicht genügend Speicher
  • EACCES: Zugriff verweigert
  • EFAULT: Ungültige Adresse
  • EBUSY: Ressource belegt
  • EEXIST: Datei existiert bereits
  • EXDEV: Geräteübergreifender Link
  • ENODEV: Kein solches Gerät
  • ENOTDIR: Kein Verzeichnis
  • EISDIR: Ist ein Verzeichnis
  • EINVAL: Ungültiges Argument
  • ENFILE: Überlauf der Systemdateitabelle
  • EMFILE: Zu viele offene Dateien
  • ENOTTY: Kein Terminalgerät
  • ETXTBSY: Textdatei ist belegt
  • EFBIG: Datei zu groß
  • ENOSPC: Kein Speicherplatz mehr auf dem Gerät
  • ESPIPE: Unzulässige Adressierung
  • EROFS: Nur-Lese-Dateisystem
  • EMLINK: Zu viele Verknüpfungen
  • EPIPE: Unterbrochene Pipe

Hinweise

  1. Thread-Sicherheit: In einer Multithreading-Umgebung,errnowird normalerweise als Thread-lokaler Speicher (TLS) implementiert, wodurch sichergestellt wird, dass jeder Thread einen unabhängigenerrnoWert.
  2. Initialwert: Wenn der Funktionsaufruf erfolgreich ist,errnowird normalerweise nicht geändert. Daher sollten Sie vor der Fehlerbehandlung sicherstellen,errnoauf 0 gesetzt wird.
  3. 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

  1. Rückgabewert prüfen: Prüfen Sie beim Aufruf von Funktionen, die fehlschlagen können, immer deren Rückgabewert.
  2. Einstellungenerrnoist 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.
  3. Nutzungstrerrorundperror: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 <stdio.h>
#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.

C-Standardbibliothek - <errno.h>

Weitere Erweiterungen