errno(3) numer ostatniego błędu

SKŁADNIA

#include <errno.h>

OPIS

Plik nagłówkowy <errno.h> definiuje zmienną całkowitą errno, która jest ustawiana w razie błędu przez wywołania systemowe oraz pewne funkcje biblioteczne tak, aby zaznaczyć, co poszło źle. Wartość ta jest istotna, tylko gdy wywołanie zwróciło błąd (tj. -1 w wypadku większości wywołań systemowych albo -1 lub NULL w wypadku większości funkcji bibliotecznych), ale funkcja biblioteczna, która zakończyła się sukcesem, także może zmienić errno.

Poprawne numery błędów są niezerowe; żadne wywołanie systemowe lub funkcja biblioteczne nigdy nie ustawi errno na zero.

W przypadku niektórych wywołań systemowych i funkcji bibliotecznych (np. getpriority(2)) -1 jest poprawną wartością zwracaną również w razie powodzenia. W takich wypadkach, aby sprawdzić, czy wywołanie lub funkcja zakończyły się powodzeniem czy błędem, należy ustawić errno na zero przed wywołaniem, a następnie - jeżeli wywołanie lub funkcja zwrócą wartość, która mogłaby wskazywać na wystąpienie błędu - sprawdzić, czy wartość errno jest niezerowa.

errno jest definiowana przez standard ISO C jako modyfikowalna l-wartość typu int, która nie może zostać jawnie zadeklarowana; errno może być makrem. Wartość errno jest lokalna w obrębie wątku, jej zmiana w jednym wątku nie wpływa na wartość w innym.

Każdej nazwie błędu określonej przez POSIX.1 musi odpowiadać inna wartość z wyjątkiem EAGAIN i EWOULDBLOCK, które mogą mieć tę samą wartość.

Poniżej przedstawiono listę nazw błędów, które są zdefiniowane pod Linuksem. Niektóre z nich oznaczono jako POSIX.1, wskazując, że nazwa błędu jest zdefiniowana przez POSIX.1-2001, lub jako C99, wskazując na nazwy błędów zdefiniowane przez C99.

E2BIG
Lista argumentów za długa (POSIX.1)
EACCES
Brak dostępu (POSIX.1)
EADDRINUSE
Adres jest już w użyciu (POSIX.1)
EADDRNOTAVAIL
Niedostępny adres (POSIX.1)
EAFNOSUPPORT
Rodzina adresów nieobsługiwana (POSIX.1)
EAGAIN
Zasoby chwilowo niedostępne (może mieć tę samą wartość co EWOULDBLOCK) (POSIX.1)
EALREADY
Operacja jest już wykonywana (POSIX.1)
EBADE
Błędna wymiana
EBADF
Błędny deskryptor pliku (POSIX.1)
EBADFD
Deskryptor pliku w złym stanie
EBADMSG
Błędny komunikat (POSIX.1)
EBADR
Błędny deskryptor żądania
EBADRQC
Zły kod żądania
EBADSLT
Błędny kanał
EBUSY
Urządzenie lub zasoby zajęte (POSIX.1)
ECANCELED
Operacja anulowana (POSIX.1)
ECHILD
Brak procesów potomnych (POSIX.1)
ECHRNG
Numer kanału poza zakresem
ECOMM
Błąd komunikacji podczas wysyłania
ECONNABORTED
Połączenie przerwane (POSIX.1)
ECONNREFUSED
Połączenie odrzucone (POSIX.1)
ECONNRESET
Połączenie zerwane (przez drugą stronę) (POSIX.1)
EDEADLK
Uniknięto zakleszczenia zasobów (POSIX.1)
EDEADLOCK
Synonim EDEADLK
EDESTADDRREQ
Wymagany jest adres docelowy (POSIX.1)
EDOM
Argument spoza dziedziny funkcji matematycznej (POSIX.1, C99)
EDQUOT
Przekroczony limit dyskowy (POSIX.1)
EEXIST
Plik istnieje (POSIX.1)
EFAULT
Błędny adres (POSIX.1)
EFBIG
Plik zbyt duży (POSIX.1)
EHOSTDOWN
Urządzenie jest wyłączone
EHOSTUNREACH
Host jest niedostępny (POSIX.1)
EIDRM
Identyfikator został usunięty (POSIX.1)
EILSEQ
Niepoprawna sekwencja bajtów (POSIX.1, C99)
EINPROGRESS
Operacja jest właśnie wykonywana (POSIX.1)
EINTR
Przerwane wywołanie systemowe (POSIX.1); patrz signal(7)
EINVAL
Zły argument (POSIX.1)
EIO
Błąd wejścia/wyjścia (POSIX.1)
EISCONN
Gniazdo już jest połączone (POSIX.1)
EISDIR
Jest katalogiem (POSIX.1)
EISNAM
Jest plikiem nazwanym
EKEYEXPIRED
Klucz wygasł
EKEYREJECTED
Klucz został odrzucony przez usługę
EKEYREVOKED
Klucz został unieważniony
EL2HLT
Poziom 2 zatrzymany
EL2NSYNC
Poziom 2 niezsynchronizowany
EL3HLT
Poziom 3 zatrzymany
EL3RST
Poziom 3 zatrzymany
ELIBACC
Brak dostępu do wymaganej biblioteki dzielonej
ELIBBAD
Próba użycia uszkodzonej biblioteki dzielonej
ELIBMAX
Próba łączenia ze zbyt wieloma bibliotekami dzielonymi
ELIBSCN
Sekcja lib w a.out jest uszkodzona
ELIBEXEC
Nie można bezpośrednio uruchomić biblioteki dzielonej
ELOOP
Za duże zagnieżdżenie dowiązań symbolicznych (POSIX.1)
EMEDIUMTYPE
Niewłaściwy typ medium
EMFILE
Za dużo otwartych plików (POSIX.1)
EMLINK
Za dużo dowiązań (POSIX.1)
EMSGSIZE
Komunikat za długi (POSIX.1)
EMULTIHOP
Próba przejścia przez zbyt wiele ruterów (POSIX.1)
ENAMETOOLONG
Za długa nazwa pliku (POSIX.1)
ENETDOWN
Sieć jest wyłączona (POSIX.1)
ENETRESET
Połączenie zerwane przez sieć (POSIX.1)
ENETUNREACH
Sieć jest niedostępna (POSIX.1)
ENFILE
Za dużo otwartych plików w systemie (POSIX.1)
ENOBUFS
Brak miejsca w buforze (POSIX.1 (opcja XSI STREAMS))
ENODATA
Brak dostępnych komunikatów w głównej kolejce odczytu strumieni (POSIX.1)
ENODEV
Nie ma takiego urządzenia (POSIX.1)
ENOENT
Nie ma takiego pliku ani katalogu (POSIX.1)
ENOEXEC
Błędny format pliku wykonywalnego (POSIX.1)
ENOKEY
Wymagany klucz niedostępny
ENOLCK
Brak dostępnych blokad (POSIX.1)
ENOLINK
Połączenie zostało przerwane (POSIX.1)
ENOMEDIUM
Brak medium
ENOMEM
Nie można przydzielić pamięci (POSIX.1)
ENOMSG
Brak komunikatu o pożądanym typie (POSIX.1)
ENONET
Maszyna nie znajduje się w tej sieci
ENOPKG
Pakiet nie jest zainstalowany
ENOPROTOOPT
Protokół niedostępny (POSIX.1)
ENOSPC
Brak miejsca na urządzeniu (POSIX.1)
ENOSR
Brak dodatkowych strumieni (POSIX.1 (opcja XSI STREAMS))
ENOSTR
Nie jest strumieniem (POSIX.1 (opcja XSI STREAMS))
ENOSYS
Niezaimplementowana funkcja (POSIX.1)
ENOTBLK
Wymagane urządzenie blokowe
ENOTCONN
Drugi koniec nie jest połączony (POSIX.1)
ENOTDIR
Nie jest katalogiem (POSIX.1)
ENOTEMPTY
Katalog nie jest pusty (POSIX.1)
ENOTSOCK
Nie jest gniazdem (POSIX.1)
ENOTSUP
Operacja nieobsługiwana (POSIX.1)
ENOTTY
Niewłaściwa operacja kontrolna (ioctl) wejścia/wyjścia (POSIX.1)
ENOTUNIQ
Nazwa nie jest unikatowa w sieci
ENXIO
Nie ma takiego urządzenia ani adresu (POSIX.1)
EOPNOTSUPP
Operacja na gnieździe nieobsługiwana (POSIX.1)

(ENOTSUP i EOPNOTSUPP mają pod Linuksem tę samą wartość, chociaż zgodnie z POSIX.1 te wartość powinny się różnić)

EOVERFLOW
Wartość za duża dla zdefiniowanego typu danych (POSIX.1)
EPERM
Operacja niedozwolona (POSIX.1)
EPFNOSUPPORT
Nieobsługiwana rodzina protokołów
EPIPE
Przerwany potok (POSIX.1)
EPROTO
Błąd protokołu (POSIX.1)
EPROTONOSUPPORT
Protokół nieobsługiwany (POSIX.1)
EPROTOTYPE
Typ protokołu nie pasuje do gniazda (POSIX.1)
ERANGE
Za duży wynik (POSIX.1, C99)
EREMCHG
Zmienił się adres drugiego końca
EREMOTE
Zdalny obiekt jest obiektem podmontowanym przez NFS
EREMOTEIO
Błąd wejścia/wyjścia w odległym systemie
ERESTART
Należy wznowić przerwane wywołanie systemowe
EROFS
System plików wyłącznie do odczytu (POSIX.1)
ESHUTDOWN
Wysyłanie po zamknięciu gniazda jest niemożliwe
ESPIPE
Błędne przesunięcie (POSIX.1)
ESOCKTNOSUPPORT
Nieobsługiwany typ gniazda
ESRCH
Nie ma takiego procesu (POSIX.1)
ESTALE
Nieaktualny uchwyt pliku (POSIX.1)

Ten błąd może wystąpić na systemie plików NFS i na innych systemach plików

ESTRPIPE
Błąd potoku biblioteki strumieni
ETIME
Upłynął czas stopera (POSIX.1 (opcja XSI STREAMS))

(POSIX.1 mówi "Przekroczenie czasu STREAM ioctl(2)")

ETIMEDOUT
Przekroczony czas oczekiwania na połączenie (POSIX.1)
ETXTBSY
Plik tekstowy zajęty (POSIX.1)
EUCLEAN
Struktura wymaga wyczyszczenia
EUNATCH
Sterownik protokołu nie jest podłączony
EUSERS
Za dużo użytkowników
EWOULDBLOCK
Operacja zostałaby zablokowana (może mieć tę samą wartość co EAGAIN) (POSIX.1)
EXDEV
Niepoprawne dowiązanie (POSIX.1)
EXFULL
Przepełniona wymiana

UWAGI

Powszechnym błędem jest robienie
if (somecall() == -1) {
    printf("somecall() zwróciło błąd\n");
    if (errno == ...) { ... }
}
ponieważ errno niekoniecznie musi mieć tę samą wartość, jaką miało po powrocie z somecall() (tj. mogła zostać zmieniona przez printf(3)). Jeżeli wartość errno powinna być utrzymana pomiędzy wywołaniami funkcji, musi być zachowywana:
if (somecall() == -1) {
    int errsv = errno;
    printf("somecall() zwróciło błąd\n");
    if (errsv == ...) { ... }
}

Powszechnie w tradycyjnym C deklarowało się ręcznie errno (np. extern int errno) zamiast włączać plik <errno.h>. Nie rób tego. To nie będzie działało z nowoczesnymi wersjami biblioteki C. Jednakże na (bardzo) starych systemach Unix, <errno.h> może nie istnieć i ta deklaracja będzie potrzebna.

O STRONIE

Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów, oraz najnowszą wersję oryginału można znaleźć pod adresem http://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Adam Byrtek (PTM) <[email protected]>, Andrzej Krzysztofowicz (PTM) <[email protected]>, Paweł Krawczyk (eglibc) <[email protected]>, Jakub Bogusz (eglibc) <[email protected]> i Robert Luberda <[email protected]>.

Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 3.71 oryginału.