ERRNO(3)

BEZEICHNUNG
errno - die Nummer des letzten aufgetretenen Fehlers

ÜBERSICHT
#include <errno.h>

extern int errno;

BESCHREIBUNG
Die Integer-Variable errno wird von Systemaufrufen (und einigen Bibliotheksfunktionen) gesetzt, um anzuzeigen, was schief gelaufen ist. Ihr Wert ist nur dann von Bedeutung, wenn der Aufruf einen Fehler (normalerweise -1) zurückgegeben hat. Eine Bibliotheksfunktion darf errno ändern, selbst wenn sie erfolgreich verläuft. Ist -1 auch ein gültiger Rückgabewert, muss errno vor dem Aufruf auf 0 gesetzt werden, um eventuelle Fehler entdecken zu können. Der ISO-C-Standard definiert errno als veränderbaren lvalue des Typs int, der nicht explizit deklariert sein darf; errno kann ein Makro sein. Jeder Thread erhält eine eigene errno; wird sie in einem Thread gesetzt, wirkt sich das nicht auf ihren Wert in anderen Threads aus. Alle gültigen Fehlernummern sind ungleich 0; keine Bibliotheksfunktion setzt errno auf 0. Alle von POSIX.1 definierten Fehlerbezeichnungen müssen voneinander verschiedene Werte besitzen. POSIX.1 enthält (in der Ausgabe von 2001) die nachfolgende Liste symbolischer Fehlerbezeichnungen. Im ISO-C-Standard sind davon EDOM und ERANGE vorgesehen. Der ISO-C Zusatz 1 definiert zusätzlich die Fehlernummer EILSEQ für Kodierungsfehler bei Multi-Byte- oder Wide-Zeichen.

E2BIG
    Die Argumentenliste zu lang

EACCES
    Keine Berechtigung

EADDRNOTAVAIL
    Adresse nicht verfügbar

EAFNOSUPPORT
    Adressfamilie nicht unterstützt

EAGAIN
    Ressource zurzeit nicht verfügbar

EALREADY
    Verbindung bereits in Bearbeitung

EBADF
    Ungültiger Dateideskriptor

EBADMSG
    Ungültige Nachricht

EBUSY
    Gerät oder Ressource belegt

ECANCELED
    Operation abgebrochen

ECHILD
    Keine Kind-Prozesse

ECONNREFUSED
    Verbindung abgelehnt

ECONNRESET
    Verbindung zurückgesetzt

EDEADLK
    Verklemmung beim Zugriff auf eine Ressource vermieden

EDESTADDRREQ
    Zieladresse erwartet

EDOM
    Domain-Fehler

EDQUOT
    reserviert

EEXIST
    Datei existiert bereits

EFAULT
    Ungültige Adresse

EFBIG
    Datei zu groß

EINPROGRESS
    Operation in Bearbeitung

EINTR
    Unterbrechung während des Betriebssystemaufrufs

EINVAL
    Argument ungültig

EIO Eingabe-/Ausgabefehler

EISCONN
    Socket ist verbunden

EISDIR
    Ist ein Verzeichnis

ELOOP
    Zuviele Stufen symbolischer Links

EMFILE
    Zu viele offene Dateien

EMLINK
    Zu viele Links

EMSGSIZE
    nicht ausreichend großer Puffer

EMULTIHOP
    reserviert

ENAMETOOLONG
    Dateiname zu lang

ENETDOWN
    Netzwerk ist unten

ENETRESET
    Verbindung durch Netzwerk abgebrochen

ENETUNREACH
    Netzwerk unerreichbar

ENFILE
    Zu viele offene Dateien im System

ENOBUFS
    Kein Pufferspeicher verfügbar

ENODATA
    Keine Nachricht verfügbar in der Lese-Warteschlange im STREAM-Kopf

ENODEV
    Die Operation wird von diesem Gerät nicht unterstützt

ENOENT
    Datei oder Verzeichnis nicht gefunden

ENOEXEC
    Fehler im Format der Programmdatei

ENOLCK
    Keine Sperren verfügbar

ENOLINK
    reserviert

ENOMEM
    Nicht genügend Hauptspeicher verfügbar

ENOMSG
    keine Nachricht des erwarteten Typs

ENOPROTOOPT
    Protokoll nicht verfügbar

ENOSPC
    kein Speicherplatz auf dem Gerät verfügbar

ENOSR
    keine STREAM-Ressourcen

ENOSTR
    kein STREAM

ENOSYS
    Die angeforderte Funktion ist nicht implementiert

ENOTCONN
    Socket nicht verbunden

ENOTDIR
    Ist kein Verzeichnis

ENOTEMPTY
    Das Verzeichnis ist nicht leer

ENOTSOCK
    kein Socket

ENOTSUP
    Die Operation wird nicht unterstützt

ENOTTY
    Unpassender IOCTL (I/O-Control) für das Gerät

ENXIO
    Das Gerät ist nicht konfiguriert

EOPNOTSUPP
    Operation nicht unterstützt auf diesem Socket

EOVERFLOW
    Wert zu lang, um im Datentyp gespeichert werden zu können

EPERM
    Die Operation ist nicht erlaubt

EPIPE
    Datenübergabe unterbrochen (broken pipe)

EPROTO
    Protokoll-Fehler

EPROTONOSUPPORT
    Protokoll nicht unterstützt

EPROTOTYPE
    falscher Protokolltyp für Socket

ERANGE
    Das numerische Ergebnis ist außerhalb des gültigen Bereiches

EROFS
    Das Dateisystem ist nur lesbar

ESPIPE
    Nicht erlaubter Seek

ESRCH
    Kein passender Prozess gefunden

ESTALE
    reserviert

ETIME
    Timeout im STREAM-ioctl()

ETIMEDOUT
    Die Wartezeit für die Verbindung ist abgelaufen

ETXTBSY
    Textdatei kann nicht ausgeführt werden, weil sie noch zum Schreiben geöffnet ist.

EWOULDBLOCK
    Operation würde blockieren (kann der gleiche Wert wie EAGAIN sein)

EXDEV
    Ungültiger Link über Gerätegrenzen hinweg

ANMERKUNG
Ein beliebter Fehler ist
    if (somecall() == -1) {
        printf("somecall() failed\n");
        if (errno == ...) { ... }
    }
zu schreiben, wobei errno nicht mehr den gleichen Wert beinhalten muss, den es nach Rückkehr von somecall() gehabt hat. Wenn der Wert von errno über einen Bibliotheksaufruf gesichert werden soll, muss er explizit gespeichert werden:
    if (somecall() == -1) {
        int errsv = errno;
        printf("somecall() failed\n");
        if (errsv == ...) { ... }
    }

SIEHE AUCH
perror(3), strerror(3).