errno(3) Nummer des letzten aufgetretenen Fehlers

ÜBERSICHT

#include <errno.h>

BESCHREIBUNG

Die Header-Datei <errno.h> definiert die Integer-Variable errno. Sie wird von Systemaufrufen (und einigen Bibliotheksfunktionen) gesetzt, um anzuzeigen, was schief gelaufen ist. Ihr Wert 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.

Gültige Fehlernummern sind allesamt ungleich 0; kein Systemaufruf und keine Bibliotheksfunktion setzt errno auf 0.

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.

Mit einer Ausnahme müssen alle von POSIX.1 beschriebenen Fehlernamen unterschiedliche Werte haben. EAGAIN und EWOULDBLOCK dürfen gleich sein.

Es folgt eine Liste der symbolischen Fehlernamen, die für Linux definiert sind. Einige von ihnen sind mit POSIX.1 gekennzeichnet, weil der Name von POSIX.1-2001 definiert wird; analog weist C99 auf C99 hin.

E2BIG
Argumentliste zu lang (POSIX.1)
EACCES
Keine Berechtigung (POSIX.1)
EADDRINUSE
Adresse schon in Gebrauch (POSIX.1)
EADDRNOTAVAIL
Adresse nicht verfügbar (POSIX.1)
EAFNOSUPPORT
Adressfamilie nicht unterstützt (POSIX.1)
EAGAIN
Ressource zeitweise nicht verfügbar (darf der gleiche Wert sein wie EWOULDBLOCK, POSIX.1)
EALREADY
Verbindung ist schon aufgebaut (POSIX.1)
EBADE
Austausch ungültig
EBADF
Schlechter Dateideskriptor (POSIX.1)
EBADFD
Dateideskriptor in schlechtem Zustand
EBADMSG
Ungültige Nachricht (POSIX.1)
EBADR
Ungültiger Anforderungsdeskriptor
EBADRQC
Ungültiger Anforderungscode
EBADSLT
Ungültiger Slot
EBUSY
Gerät oder Ressource beschäftigt/belegt
ECANCELED
Operation abgebrochen (POSIX.1)
ECHILD
Keine Kind-Prozesse (POSIX.1)
ECHRNG
Kanalnummer außerhalb des zulässigen Bereichs
ECOMM
Kommunikationsfehler beim Senden
ECONNABORTED
Verbindung abgebrochen (POSIX.1)
ECONNREFUSED
Verbindung abgelehnt (POSIX.1)
ECONNRESET
Verbindung zurückgesetzt (POSIX.1)
EDEADLK
Verklemmung beim Zugriff auf eine Resource (deadlock) vermieden (POSIX.1)
EDEADLOCK
Synonym für EDEADLK
EDESTADDRREQ
Zieladresse erforderlich (POSIX.1)
EDOM
Argument einer mathematischen Funktion außerhalb des Definitionsbereichs (POSIX.1, C99)
EDQUOT
Festplattenkontingent (disk quota) überschritten (POSIX.1)
EEXIST
Datei schon vorhanden (POSIX.1)
EFAULT
Ungültige Adresse (POSIX.1)
EFBIG
Datei zu groß (POSIX.1)
EHOSTDOWN
Host/Rechner ist nicht in Betrieb
EHOSTUNREACH
Host/Rechner nicht erreichbar (POSIX.1)
EIDRM
Identifier/Bezeichner/Kennung entfernt (POSIX.1)
EILSEQ
Ungültige Byte-Sequenz (POSIX.1, C99)
EINPROGRESS
Operation wird gerade ausgeführt (POSIX.1)
EINTR
Aufruf einer unterbrochenen Funktion (POSIX.1); siehe signal(7)
EINVAL
Ungültiges Argument (POSIX.1)
EIO
E/A-Fehler (POSIX.1)
EISCONN
Socket ist verbunden (POSIX.1)
EISDIR
Ist ein Verzeichnis (POSIX.1)
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
Ebene 2 angehalten
EL2NSYNC
Ebene 2 nicht synchronisiert
EL3HLT
Ebene 3 angehalten
EL3RST
Ebene 3 angehalten
ELIBACC
Zugriff auf notwendige Laufzeitbibliothek nicht möglich
ELIBBAD
Zugriff auf eine beschädigte Laufzeitbibliothek
ELIBMAX
Versuch, zu viele Laufzeitbibliotheken zu linken
ELIBSCN
Bibliotheksabschnitt in a.out defekt
ELIBEXEC
Eine Laufzeitbibliothek kann nicht direkt ausgeführt werden
ELOOP
Zu viele Ebenen von symbolischen Links (POSIX.1)
EMEDIUMTYPE
Falscher Medientyp
EMFILE
Zu viele offene Dateien ((POSIX.1); typischerweise wird dies durch Überschreiten der in getrlimit(2) beschriebenen Ressourcenbegrenzung RLIMIT_NOFILE hervorgerufen
EMLINK
Zu viele Links (POSIX.1)
EMSGSIZE
Nachricht zu lang (POSIX.1)
EMULTIHOP
Multihop (mehrere Etappen) versucht (POSIX.1)
ENAMETOOLONG
Dateiname zu lang (POSIX.1)
ENETDOWN
Netzwerk außer Betrieb (POSIX.1)
ENETRESET
Verbindungsabbruch durch das Netzwerk (POSIX.1)
ENETUNREACH
Netzwerk nicht erreichbar (POSIX.1)
ENFILE
Zu viele offene Dateien ((POSIX.1); dies ist wahrscheinlich ein Ergebnis der Beschränkung /proc/sys/fs/file-max (siehe proc(5)).
ENOBUFS
Kein Platz für Puffer verfügbar (POSIX.1 (XSI STREAMS option))
ENODATA
Im STREAM-Head der Lese-Warteschlange ist keine Nachricht verfügbar. (POSIX.1)
ENODEV
Kein solches Gerät vorhanden (POSIX.1)
ENOENT
Datei oder Verzeichnis nicht vorhanden (POSIX.1)

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)
ENOKEY
Erforderlicher Schlüssel nicht verfügbar
ENOLCK
Keine Sperren verfügbar (POSIX.1)
ENOLINK
Link wurde erschwert (POSIX.1)
ENOMEDIUM
Kein Medium gefunden
ENOMEM
Nicht genügend Platz (POSIX.1)
ENOMSG
Keine Nachricht vom gewünschten Typ (POSIX.1)
ENONET
Machine ist nicht an das Netzwerk angeschlossen
ENOPKG
Paket nicht installiert
ENOPROTOOPT
Protokoll nicht verfügbar (POSIX.1)
ENOSPC
Auf dem Gerät ist kein Speicherplatz mehr verfügbar (POSIX.1)
ENOSR
Keine STREAM-Ressourcen (POSIX.1 (Option XSI STREAMS))
ENOSTR
Ist kein STREAM (POSIX.1 (XSI STREAMS option))
ENOSYS
Funktion nicht implementiert (POSIX.1)
ENOTBLK
Blockgerät erforderlich
ENOTCONN
Der Socket ist nicht verbunden (POSIX.1)
ENOTDIR
Ist kein Verzeichnis (POSIX.1)
ENOTEMPTY
Das Verzeichnis ist nicht leer (POSIX.1)
ENOTSOCK
Ist kein Socket (POSIX.1)
ENOTSUP
Operation wird nicht unterstützt (POSIX.1)
ENOTTY
Unpassende E/A-Steuerungsoperation (POSIX.1)
ENOTUNIQ
Name ist im Netzwerk nicht eindeutig
ENXIO
Kein solches Gerät/Adresse (POSIX.1)
EOPNOTSUPP
Operation für Sockets nicht unterstützt (POSIX.1)

(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)
EPERM
Operation nicht gestattet (POSIX.1)
EPFNOSUPPORT
Protokollfamilie nicht unterstützt
EPIPE
Pipe unterbrochen (POSIX.1)
EPROTO
Protokollfehler (POSIX.1)
EPROTONOSUPPORT
Protokoll nicht unterstützt (POSIX.1)
EPROTOTYPE
Falscher Protokolltyp für Socket (POSIX.1)
ERANGE
Ergebnis zu groß (POSIX.1, C99)
EREMCHG
Entfernte Adresse geändert
EREMOTE
Objekt ist entfernt/nicht lokal
EREMOTEIO
Entfernter E/A-Fehler
ERESTART
Unterbrochener Systemaufruf sollte erneut gestart werden
EROFS
nur-lesbares Dateisystem (POSIX.1)
ESHUTDOWN
Senden nach Herunterfahren des Transport-Endpunktes nicht möglich
ESPIPE
ungültiger Seek (POSIX.1)
ESOCKTNOSUPPORT
Socket-Typ nicht unterstützt
ESRCH
Kein passender Prozess gefunden (POSIX.1)
ESTALE
»Abgestandener« Datei-Handle (POSIX.1)

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

ESTRPIPE
Stream-Pipelinefehler
ETIME
Zeit abgelaufen (POSIX.1 (XSI STREAMS option))

(POSIX.1 nennt das »STREAM ioctl(2) timeout«)

ETIMEDOUT
Die Wartezeit für die Verbindung ist abgelaufen (POSIX.1)
ETXTBSY
Textdatei belegt (POSIX.1)
EUCLEAN
Struktur muss aufgeräumt werden
EUNATCH
Kein zugeordneter Treiber für Protokoll
EUSERS
Zu viele Benutzer
EWOULDBLOCK
Operation würden blockieren (darf der gleiche Wert sein wie EAGAIN, POSIX.1)
EXDEV
Ungültiger Link (POSIX.1)
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 == ...) { ... }
}

Im traditionellen C war es gebräuchlich, errno manuell (mittels extern int errno) zu deklarieren anstatt <errno.h> einzubinden. Unterlassen Sie das. Das wird mit modernen Versionen der C-Bibliothek nicht funktionieren. Es kann aber auf (sehr) alten UNIX-Systemen vorkommen, dass <errno.h> fehlt und die Deklaration erforderlich ist.

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 4.06 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer <[email protected]>, Mario Blättermann <[email protected]> und Helge Kreutzmann <[email protected]> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 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 <[email protected]>.