errno

Autres langues

Langue: de

Version: 5. Oktober 2002 (openSuse - 09/10/07)

Autres sections - même nom

Section: 3 (Bibliothèques de fonctions)

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).