ERRNO(3)

NAZWA
errno - 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.

ZOBACZ TAKŻE
err(3), error(3), perror(3), strerror(3)

O STRONIE
Angielska wersja tej strony pochodzi z wydania 3.52 projektu Linux man-pages. Opis projektu oraz informacje dotyczące zgłaszania błędów 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) <abyrtek@priv.onet.pl>, Andrzej Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl>, Paweł Krawczyk (eglibc) <kravietz@ceti.pl>, Jakub Bogusz (eglibc) <qboosh@pld-linux.org> i Robert Luberda <robert@debian.org>.

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.52 oryginału.