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 aus somecall() 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 <[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 die Mailingliste der Übersetzer