errno(3)

BEZEICHNUNG
errno - Nummer des letzten aufgetretenen Fehlers

BIBLIOTHEK
Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT
#include <errno.h>

BESCHREIBUNG
Die Header-Datei <errno.h> definiert die Variable errno mit Typ integer. Sie wird von Systemaufrufen (und einigen Bibliotheksfunktionen) gesetzt, um anzuzeigen, was schief gelaufen ist.

  errno
Der Wert in errno ist nur dann von Bedeutung, wenn der Rückgabewert des Funktionsaufrufs einen Fehler anzeigt (d.h. -1 bei den meisten Systemaufrufen; -1 oder NULL bei den meisten Bibliotheksfunktionen). Eine erfolgreich aufgerufene Funktion darf den Wert von errno ändern. Der Wert von errno wird niemals von irgendeinem Systemaufruf oder einer Bibliotheksfunktion auf Null gesetzt.

Für einige Systemaufrufe und Bibliotheksfunktionen (wie z.B. getpriority(2)) ist -1 ein gültiger Rückgabewert bei erfolgreichem Funktionsaufruf. In solchen Fällen kann eine erfolgreiche von einer fehlgeschlagenen Ausführung der Funktion unterschieden werden, indem vor dem Aufruf errno auf Null gesetzt wird und wenn der Rückgabestatus einen Fehler anzeigt, errno untersucht wird.

Der ISO-C-Standard definiert errno als veränderbaren lvalue des Typs int, der nicht explizit deklariert sein muss; errno darf ein Makro sein. Jeder Thread erhält eine eigene, lokale errno; wird sie in einem Thread gesetzt, wirkt sich das nicht auf ihren Wert in anderen Threads aus.

  Fehlernummern und -namen
Gültige Fehlernummer sind alle positiven Zahlen. Die Header-Datei <errno.h> definiert für jeden der möglichen Fehlernummern, die in errno auftreten können, symbolische Namen.

Mit einer Ausnahme müssen alle von POSIX.1 beschriebenen Fehlernamen unterschiedliche Werte haben. EAGAIN und EWOULDBLOCK dürfen gleich sein. Unter Linux haben diese beiden Variablen auf allen Architekturen den gleichen Wert.

Die Fehlernummern, die jedem symbolischen Namen entsprechen, unterscheiden sich zwischen UNIX-Systemen und selbst zwischen verschiedenen Architekturen unter Linux. Daher ist der numerische Wert in der nachfolgenden Liste der Fehlernamen nicht enthalten. Die Funktionen perror(3) und strerror(3) können dazu verwandt werden, diese Namen in die entsprechenden textuellen Fehlermeldungen umzuwandeln.

Auf einem konkreten Linux-System kann die Liste aller symbolischen Fehlernamen und der entsprechenden Fehlernummern mittels des Befehls errno(1) (Teil des Pakets moreutils) erhalten werden:

    $ errno -l;
    EPERM 1 Die Operation ist nicht erlaubt
    ENOENT 2 Datei oder Verzeichnis nicht gefunden
    ESRCH 3 Kein passender Prozess gefunden
    EINTR 4 Unterbrechung während des Betriebssystemaufrufs
    EIO 5 Eingabe-/Ausgabefehler
    …

Der Befehl errno(1) kann auch zum Nachschlagen einzelner Fehlernummern und -namen und der Suche nach Zeichenketten aus den Fehlerbeschreibungen wie in dem nachfolgenden Beispiel verwandt werden:

    $ errno 2;
    ENOENT 2 Datei oder Verzeichnis nicht gefunden
    $ errno ESRCH;
    ESRCH 3 Kein passender Prozess gefunden
    $ errno -s Berechtigung;
    EACCES 13 Keine Berechtigung

  Liste der Fehlernamen
In der nachfolgenden Liste der symbolischen Fehlernamen sind verschiedene Namen wie folgt gekennzeichnet:

POSIX.1-2001
    Der Name ist durch POSIX.1-2001 definiert und wird in neueren POSIX.1-Versionen definiert, außer es ist anderweitig angegeben.

POSIX.1-2008
    Der Name ist in POSIX.1-2008 definiert, war aber nicht in älteren POSIX.1-Standards verfügbar.

C99 Der Name ist durch C99 definiert.

Es folgt eine Liste von symbolischen Fehlernamen, die unter Linux definiert sind:

E2BIG
    Argumentliste zu lang (POSIX.1-2001)

EACCES
    Keine Berechtigung (POSIX.1-2001)

EADDRINUSE
    Adresse schon in Gebrauch (POSIX.1-2001)

EADDRNOTAVAIL
    Adresse nicht verfügbar (POSIX.1-2001)

EAFNOSUPPORT
    Adressfamilie nicht unterstützt (POSIX.1-2001)

EAGAIN
    Ressource zeitweise nicht verfügbar (darf der gleiche Wert wie EWOULDBLOCK sein, POSIX.1-2001)

EALREADY
    Verbindung ist schon aufgebaut (POSIX.1-2001)

EBADE
    Austausch ungültig

EBADF
    Schlechter Dateideskriptor (POSIX.1-2001)

EBADFD
    Dateideskriptor in schlechtem Zustand

EBADMSG
    Ungültige Nachricht (POSIX.1-2001)

EBADR
    Ungültiger Anforderungsdeskriptor

EBADRQC
    Ungültiger Anforderungscode

EBADSLT
    Ungültiger Slot

EBUSY
    Gerät oder Ressource beschäftigt/belegt (POSIX.1-2001)

ECANCELED
    Aktion abgebrochen (POSIX.1-2001)

ECHILD
    Keine Kindprozesse (POSIX.1-2001)

ECHRNG
    Kanalnummer außerhalb des zulässigen Bereichs

ECOMM
    Kommunikationsfehler beim Senden

ECONNABORTED
    Verbindung abgebrochen (POSIX.1-2001)

ECONNREFUSED
    Verbindung abgelehnt (POSIX.1-2001)

ECONNRESET
    Verbindung zurückgesetzt (POSIX.1-2001)

EDEADLK
    Verklemmung beim Zugriff auf eine Resource (deadlock) vermieden (POSIX.1-2001)

EDEADLOCK
    Auf den meisten Architekturen ein Synonym für EDEADLK. Auf einigen Architekturen (zum Beispiel Linux MIPS, PowerPC, SPARC) ist es ein separater Fehlercode »Verklemmungsfehler bei Dateisperrung«.

EDESTADDRREQ
    Zieladresse erforderlich (POSIX.1-2001)

EDOM
    Argument einer mathematischen Funktion außerhalb des Definitionsbereichs (POSIX.1, C99)

EDQUOT
    Festplattenkontingent (disk quota) überschritten (POSIX.1-2001)

EEXIST
    Datei schon vorhanden (POSIX.1-2001)

EFAULT
    Ungültige Adresse (POSIX.1-2001)

EFBIG
    Datei zu groß (POSIX.1-2001)

EHOSTDOWN
    Host/Rechner ist nicht in Betrieb

EHOSTUNREACH
    Host/Rechner nicht erreichbar (POSIX.1-2001)

EHWPOISON
    Speicherseite hat einen Hardware-Fehler

EIDRM
    Identifier/Bezeichner/Kennung entfernt (POSIX.1-2001)

EILSEQ
    Ungültiger oder unvollständiger Multibyte oder weites Zeichen (POSIX.1, C99)

    Der hier gezeigte Text ist eine Glibc-Fehlerbeschreibung: in POSIX.1 wird dieser Fehler als »Ungültige Byte-Sequenz« beschrieben.

EINPROGRESS
    Aktion wird gerade ausgeführt (POSIX.1-2001)

EINTR
    Unterbrochener Funktionsaufruf (POSIX.1-2001); siehe signal(7)

EINVAL
    Ungültiges Argument (POSIX.1-2001)

EIO Ein-/Ausgabefehler (POSIX.1-2001)

EISCONN
    Socket ist verbunden (POSIX.1-2001)

EISDIR
    Ist ein Verzeichnis (POSIX.1-2001)

EISNAM
    Ist eine Datei benannten Typs

EKEYEXPIRED
    Schlüssel ist abgelaufen

EKEYREJECTED
    Schlüssel wurde vom Dienst zurückgewiesen

EKEYREVOKED
    Schlüssel wurde widerrufen

EL2HLT
    Stufe 2 angehalten

EL2NSYNC
    Stufe 2 nicht synchronisiert

EL3HLT
    Stufe 3 angehalten

EL3RST
    Stufe 3 zurückgesetzt

ELIBACC
    Zugriff auf notwendige dynamische Bibliothek nicht möglich

ELIBBAD
    Zugriff auf eine beschädigte dynamische Bibliothek

ELIBMAX
    Versuch, zu viele dynamische Bibliotheken zu linken

ELIBSCN
    Abschnitt .lib in a.out defekt

ELIBEXEC
    Eine dynamische Bibliothek kann nicht direkt ausgeführt werden

ELNRNG
    Link-Nummer außerhalb des zulässigen Bereichs

ELOOP
    Zu viele Ebenen von symbolischen Links (POSIX.1-2001)

EMEDIUMTYPE
    Falscher Medientyp

EMFILE
    Zu viele offene Dateien (POSIX.1-2001). Typischerweise wird dies durch Überschreiten der in getrlimit(2) beschriebenen Ressourcenbegrenzung RLIMIT_NOFILE hervorgerufen. Es kann aber auch durch Überschreiten der in /proc/sys/fs/nr_open festgelegten Beschränkung hervorgerufen werden.

EMLINK
    Zu viele Links (POSIX.1-2001)

EMSGSIZE
    Nachricht zu lang (POSIX.1-2001)

EMULTIHOP
    Multihop (mehrere Etappen) versucht (POSIX.1-2001)

ENAMETOOLONG
    Dateiname zu lang (POSIX.1-2001)

ENETDOWN
    Netzwerk außer Betrieb (POSIX.1-2001)

ENETRESET
    Verbindungsabbruch durch das Netzwerk (POSIX.1-2001)

ENETUNREACH
    Netzwerk nicht erreichbar (POSIX.1-2001)

ENFILE
    Zu viele offene Dateien (POSIX.1-2001). Unter Linux ist dies wahrscheinlich ein Ergebnis der Beschränkung /proc/sys/fs/file-max (siehe proc(5)).

ENOANO
    Keine Anode

ENOBUFS
    Kein Platz für Puffer verfügbar (POSIX.1 (XSI-STREAMS-Option))

ENODATA
    Das benannte Attribut existiert nicht oder der Prozess hat keinen Zugriff auf dieses Attribut; siehe xattr(7).

    In POSIX.1-2001 (Option »XSI STREAMS«) wurde dieser Fehler als »No message is available on the STREAM head read queue« beschrieben.

ENODEV
    Kein solches Gerät vorhanden (POSIX.1-2001)

ENOENT
    Keine solche Datei oder kein solches Verzeichnis vorhanden (POSIX.1-2001)

    Typischerweise tritt dieser Fehler auf, wenn der angegebene Pfadname nicht existiert, einer der Komponenten in dem Verzeichnispräfix eines Pfadnamens nicht existiert oder der angegebene Pfadname ein hängender symbolischer Link ist.

ENOEXEC
    Fehler im Format der Programmdatei (POSIX.1-2001)

ENOKEY
    Erforderlicher Schlüssel nicht verfügbar

ENOLCK
    Keine Sperren verfügbar (POSIX.1-2001)

ENOLINK
    Link wurde abgetrennt (POSIX.1-2001)

ENOMEDIUM
    Kein Medium gefunden

ENOMEM
    Nicht genügend Platz/Nicht genügend Hauptspeicher verfügbar (POSIX.1-2001)

ENOMSG
    Keine Nachricht vom gewünschten Typ (POSIX.1-2001)

ENONET
    Machine ist nicht an das Netzwerk angeschlossen

ENOPKG
    Paket nicht installiert

ENOPROTOOPT
    Protokoll nicht verfügbar (POSIX.1-2001)

ENOSPC
    Auf dem Gerät ist kein Speicherplatz mehr verfügbar (POSIX.1-2001)

ENOSR
    Keine STREAM-Ressourcen (POSIX.1 (Option XSI STREAMS))

ENOSTR
    Ist kein STREAM (POSIX.1 (XSI-STREAMS-Option))

ENOSYS
    Funktion nicht implementiert (POSIX.1-2001)

ENOTBLK
    Blockgerät erforderlich

ENOTCONN
    Der Socket ist nicht verbunden (POSIX.1-2001)

ENOTDIR
    Ist kein Verzeichnis (POSIX.1-2001)

ENOTEMPTY
    Das Verzeichnis ist nicht leer (POSIX.1-2001)

ENOTRECOVERABLE
    Zustand nicht wiederherstellbar (POSIX.1-2008)

ENOTSOCK
    Ist kein Socket (POSIX.1-2001)

ENOTSUP
    Aktion wird nicht unterstützt (POSIX.1-2001)

ENOTTY
    Unpassende E/A-Steuerungsaktion (POSIX.1-2001)

ENOTUNIQ
    Name ist im Netzwerk nicht eindeutig

ENXIO
    Kein solches Gerät/Adresse (POSIX.1-2001)

EOPNOTSUPP
    Aktion für Sockets nicht unterstützt (POSIX.1-2001)

    (ENOTSUP und EOPNOTSUPP haben auf Linux den gleichen Wert, gemäß POSIX.1 sollten diese Fehlerwerte unterschiedlich sein.)

EOVERFLOW
    Wert zu groß für Speicherung im Datentyp (POSIX.1-2001)

EOWNERDEAD
    Eigentümer verstarb (POSIX.1-2008)

EPERM
    Aktion nicht gestattet (POSIX.1-2001)

EPFNOSUPPORT
    Protokollfamilie nicht unterstützt

EPIPE
    Pipe unterbrochen (POSIX.1-2001)

EPROTO
    Protokollfehler (POSIX.1-2001)

EPROTONOSUPPORT
    Protokoll nicht unterstützt (POSIX.1-2001)

EPROTOTYPE
    Falscher Protokolltyp für Socket (POSIX.1-2001)

ERANGE
    Ergebnis zu groß (POSIX.1, C99)

EREMCHG
    Adresse in der Ferne geändert

EREMOTE
    Objekt ist in der Ferne/nicht lokal

EREMOTEIO
    E/A-Fehler in der Ferne

ERESTART
    Unterbrochener Systemaufruf sollte erneut gestart werden

ERFKILL
    Aktion aufgrund von RF-Kill nicht möglich

EROFS
    Nur-lesbares Dateisystem (POSIX.1-2001)

ESHUTDOWN
    Senden nach Herunterfahren des Transport-Endpunktes nicht möglich

ESPIPE
    Ungültiger Seek (POSIX.1-2001)

ESOCKTNOSUPPORT
    Socket-Typ nicht unterstützt

ESRCH
    Kein solcher Prozess vorhanden (POSIX.1-2001)

ESTALE
    Veraltete Dateizugriffsnummer (file handle) (POSIX.1-2001)

    Dieser Fehler kann für NFS- und für andere Dateisysteme auftreten.

ESTRPIPE
    Stream-Pipe-Fehler

ETIME
    Timer abgelaufen (POSIX.1 (XSI-STREAMS-Option))

    (POSIX.1 nennt das »STREAM ioctl(2)-Zeitüberschreitung«)

ETIMEDOUT
    Verbindung ist abgelaufen (POSIX.1-2001)

ETOOMANYREFS
    Zu viele Referenzen: Zusammenfügen nicht möglich

ETXTBSY
    Textdatei belegt (POSIX.1-2001)

EUCLEAN
    Struktur muss aufgeräumt werden

EUNATCH
    Kein zugeordneter Treiber für Protokoll

EUSERS
    Zu viele Benutzer

EWOULDBLOCK
    Aktion würden blockieren (kann der gleiche Wert wie EAGAIN sein) (POSIX.1-2001)

EXDEV
    Ungültiger Geräte-Querverweis (POSIX.1-2001)

EXFULL
    Austausch/Vermittlungsstelle voll

ANMERKUNGEN
Ein verbreiteter Programmierfehler ist

    if (somecall() == -1) {
        printf("somecall() fehlgeschlagen\n");
        if (errno == …) { …; }
    }

Hier muss errno nicht mehr den Wert haben, den er bei der Rückkehr aussomecall() hatte. (D.h., der Wert konnte durch den Aufruf von printf(3) verändert werden). Wenn der Wert von errno über einen Bibliotheksaufruf erhalten bleiben soll, muss er gespeichert werden:

    if (somecall() == -1) {
        int errsv = errno;
        printf("somecall() fehlgeschlagen\n");
        if (errsv == …) { …; }
    }

Beachten Sie, dass POSIX-Thread-APIs errno im Fehlerfall nicht setzen. Stattdessen liefern sie im Fehlerfall eine Fehlernummer als Funktionsergebnis zurück. Diese Fehlernummern haben die gleichen Bedeutungen wie die in errno durch andere APIs zurückgelieferten Fehlernummern.

Bei einigen Uraltsystemen war <errno.h> nicht vorhanden oder deklarierte errno nicht, so dass eine manuelle Deklaration von errno notwendig war (d.h. extern int errno). Machen Sie das nicht. Das ist schon seit langer Zeit nicht mehr notwendig und wird bei modernen Versionen der C-Bibliothek zu Problemen führen.

SIEHE AUCH
errno(1), err(3), error(3), perror(3), strerror(3)

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer <Martin.E.Schauer@gmx.de>, Mario Blättermann <mario.blaettermann@gmail.com> und Helge Kreutzmann <debian@helgefjell.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer: debian-l10n-german@lists.debian.org.