errno - Nummer des letzten aufgetretenen Fehlers
Standard-C-Bibliothek (libc, -lc)
ÜBERSICHT
#include <errno.h>
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.
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.
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
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
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.
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 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.