errno(3)

NAZWA
errno - numer ostatniego błędu

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

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.

  errno
Wartość zmiennej errno jest istotna, tylko gdy wywołanie zwróciło błąd (tj. -1 w wypadku większości wywołań systemowych; -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. Żadne wywołanie systemowe ani żadna funkcja biblioteczna nie ustawiają 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.

  Numery i nazwy błędów
Poprawne numery błędów są liczbami dodatnimi. Plik nagłówkowy <errno.h> definiuje nazwy symboliczna dla wszystkich dodatnich numerów błędów, które mogą wystąpić w zmiennej errno.

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ść. W Linuksie mają one taką samą wartość na wszystkich architekturach.

Numery błędów, które odpowiadają nazwom symbolicznym, mogą być różne w różnych systemach uniksowych, a nawet mogą się różnić pomiędzy architekturami linuksowymi. Dlatego poniższa lista nazw błędów nie zawiera numerycznych wartości kodów błędów. Można użyć funkcji perror(3) i strerror(3) do skonwertowania nazw do odpowiadających im tekstowych komunikatów błędów.

Używając polecenia errno(1) (z pakietu moreutils) w dowolnym systemie linuksowym, można uzyskać listę wszystkich symbolicznych nazw błędów i odpowiadających im numerów błędów:

    $ errno -l;
    EPERM 1 Operacja niedozwolona
    ENOENT 2 Nie ma takiego pliku ani katalogu
    ESRCH 3 Nie ma takiego procesu
    EINTR 4 Przerwane wywołanie systemowe
    EIO 5 Błąd wejścia/wyjścia
    ...

Polecenia errno(1) można także użyć do wyszukania indywidualnych kodów i nazw błędów oraz do wyszukania błędów po ich opisach, tak jak w poniższych przykładach:

    $ errno 2;
    ENOENT 2 Nie ma takiego pliku ani katalogu
    $ errno ESRCH;
    ESRCH 3 Nie ma takiego procesu
    $ errno -s "brak dostępu";
    EACCES 13 Brak dostępu

  Lista nazw błędów
W poniższej liście symbolicznych nazw błędów, pewne nazwy oznaczono w następujący sposób:

POSIX.1-2001
    Nazwa jest definiowana przez POSIX.1-2001, jak i przez późniejsze wersje standardu POSIX.1, chyba że zaznaczono, że jest inaczej.

POSIX.1-2008
    Nazwa jest definiowana przez POSIX.1-2008, ale nie była obecna we wcześniejszych standardach POSIX.1.

C99 Nazwa jest zdefiniowana przez standard C99.

Poniżej przedstawiono listę symbolicznych nazw błędów, które są zdefiniowane pod Linuksem:

E2BIG
    Lista argumentów za długa (POSIX.1-2001).

EACCES
    Brak dostępu (POSIX.1-2001).

EADDRINUSE
    Adres jest już w użyciu (POSIX.1-2001).

EADDRNOTAVAIL
    Niedostępny adres (POSIX.1-2001).

EAFNOSUPPORT
    Rodzina adresów nieobsługiwana (POSIX.1-2001).

EAGAIN
    Zasoby chwilowo niedostępne (może mieć tę samą wartość, co EWOULDBLOCK) (POSIX.1-2001).

EALREADY
    Operacja jest już wykonywana (POSIX.1-2001).

EBADE
    Błędna wymiana.

EBADF
    Błędny deskryptor pliku (POSIX.1-2001).

EBADFD
    Deskryptor pliku w złym stanie.

EBADMSG
    Błędny komunikat (POSIX.1-2001).

EBADR
    Błędny deskryptor żądania.

EBADRQC
    Zły kod żądania.

EBADSLT
    Błędny kanał.

EBUSY
    Urządzenie lub zasoby zajęte (POSIX.1-2001).

ECANCELED
    Operacja anulowana (POSIX.1-2001).

ECHILD
    Brak procesów potomnych (POSIX.1-2001).

ECHRNG
    Numer kanału poza zakresem.

ECOMM
    Błąd komunikacji podczas wysyłania.

ECONNABORTED
    Połączenie przerwane (POSIX.1-2001).

ECONNREFUSED
    Połączenie odrzucone (POSIX.1-2001).

ECONNRESET
    Połączenie zerwane (przez drugą stronę) (POSIX.1-2001).

EDEADLK
    Uniknięto zakleszczenia zasobów (POSIX.1-2001).

EDEADLOCK
    Na większość architektur — synonim EDEADLK. Na niektórych architekturach (np. linuksowym MIPS, PowerPC, SPARC) jest to oddzielny kod błędu „Błąd zakleszczenia blokowania pliku”.

EDESTADDRREQ
    Wymagany jest adres docelowy (POSIX.1-2001).

EDOM
    Argument spoza dziedziny funkcji matematycznej (POSIX.1, C99).

EDQUOT
    Przekroczony limit dyskowy (POSIX.1-2001).

EEXIST
    Plik istnieje (POSIX.1-2001).

EFAULT
    Błędny adres (POSIX.1-2001).

EFBIG
    Plik zbyt duży (POSIX.1-2001).

EHOSTDOWN
    Urządzenie jest wyłączone.

EHOSTUNREACH
    Brak trasy do hosta (POSIX.1-2001).

EHWPOISON
    Strona pamięci ma błąd sprzętowy.

EIDRM
    Identyfikator został usunięty (POSIX.1-2001).

EILSEQ
    Błędny lub niepełny znak wielobajtowy (POSIX.1, C99).

    Komunikat tutaj pokazany pochodzi z opisu tego błędu w bibliotece glibc. W standardzie POSIX.1 ten błąd jest opisany jako „Niepoprawna sekwencja bajtów”.

EINPROGRESS
    Operacja jest właśnie wykonywana (POSIX.1-2001).

EINTR
    Przerwane wywołanie systemowe (POSIX.1-2001); patrz signal(7)

EINVAL
    Zły argument (POSIX.1-2001).

EIO Błąd wejścia/wyjścia (POSIX.1-2001).

EISCONN
    Gniazdo już jest połączone (POSIX.1-2001).

EISDIR
    Jest katalogiem (POSIX.1-2001).

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.

ELNRNG
    Numer kanału poza zakresem.

ELOOP
    Za duże zagnieżdżenie dowiązań symbolicznych (POSIX.1-2001).

EMEDIUMTYPE
    Niewłaściwy typ medium.

EMFILE
    Zbyt wiele otwartych plików (POSIX.1-2001); zwykle spowodowane przekroczeniem limitu zasobów RLIMIT_NOFILE opisanego w getrlimit(2). Może być spowodowane również przekroczeniem limitu określonego w /proc/sys/fs/nr_open.

EMLINK
    Za dużo dowiązań (POSIX.1-2001).

EMSGSIZE
    Komunikat za długi (POSIX.1-2001).

EMULTIHOP
    Próba przejścia przez zbyt wiele ruterów (POSIX.1-2001).

ENAMETOOLONG
    Za długa nazwa pliku (POSIX.1-2001).

ENETDOWN
    Sieć jest wyłączona (POSIX.1-2001).

ENETRESET
    Połączenie zerwane przez sieć (POSIX.1-2001).

ENETUNREACH
    Sieć jest niedostępna (POSIX.1-2001).

ENFILE
    Zbyt wiele otwartych plików (POSIX.1-2001); pod Linuksem zwykle jest to rezultat natrafienia na limit /proc/sys/fs/file-max (patrz proc(5)).

ENOANO
    „No anode” — dosł. brak anody (?!). /Domniemywa się, że mogło chodzić tu o wariant „inode” — i-węzła lub o „allocation node” — węzeł alokacji — przyp. tłum./

ENOBUFS
    Brak miejsca w buforze (POSIX.1 (opcja XSI STREAMS)).

ENODATA
    Atrybut o takiej nazwie nie istnieje lub proces nie ma dostępu do tego atrybutu, zob. xattr(7).

    W POSIX.1-2001 (opcja XSI STREAMS), błąd ten opisano jako „Nie jest dostępny żaden komunikat na początku kolejki odczytu STREAM”

ENODEV
    Nie ma takiego urządzenia (POSIX.1-2001).

ENOENT
    Nie ma takiego pliku ani katalogu (POSIX.1-2001).

    Zwykle błąd ten jest wynikiem nieistnienia podanej ścieżki lub nieistnienia jednej z części składowej (katalogu) ścieżki lub oznacza, że podana ścieżka jest nieprawidłowym dowiązaniem symbolicznym.

ENOEXEC
    Błędny format pliku wykonywalnego (POSIX.1-2001).

ENOKEY
    Wymagany klucz niedostępny.

ENOLCK
    Brak dostępnych blokad (POSIX.1-2001).

ENOLINK
    Połączenie zostało przerwane (POSIX.1-2001).

ENOMEDIUM
    Brak medium.

ENOMEM
    Za mało miejsca/nie można przydzielić pamięci (POSIX.1-2001).

ENOMSG
    Brak komunikatu o pożądanym typie (POSIX.1-2001).

ENONET
    Maszyna nie znajduje się w tej sieci.

ENOPKG
    Pakiet nie jest zainstalowany.

ENOPROTOOPT
    Protokół niedostępny (POSIX.1-2001).

ENOSPC
    Brak miejsca na urządzeniu (POSIX.1-2001).

ENOSR
    Brak dodatkowych strumieni (POSIX.1 (opcja XSI STREAMS)).

ENOSTR
    Nie jest strumieniem (POSIX.1 (opcja XSI STREAMS)).

ENOSYS
    Niezaimplementowana funkcja (POSIX.1-2001).

ENOTBLK
    Wymagane urządzenie blokowe.

ENOTCONN
    Drugi koniec nie jest połączony (POSIX.1-2001).

ENOTDIR
    Nie jest katalogiem (POSIX.1-2001).

ENOTEMPTY
    Katalog nie jest pusty (POSIX.1-2001).

ENOTRECOVERABLE
    Stan bez możliwości wyjścia (POSIX.1-2008).

ENOTSOCK
    Nie jest gniazdem (POSIX.1-2001).

ENOTSUP
    Operacja nieobsługiwana (POSIX.1-2001).

ENOTTY
    Niewłaściwa operacja kontrolna (ioctl) wejścia/wyjścia (POSIX.1-2001).

ENOTUNIQ
    Nazwa nie jest unikatowa w sieci.

ENXIO
    Nie ma takiego urządzenia ani adresu (POSIX.1-2001).

EOPNOTSUPP
    Operacja na gnieździe nieobsługiwana (POSIX.1-2001).

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

EOWNERDEAD
    Właściciel zmarł (POSIX.1-2008).

EPERM
    Operacja niedozwolona (POSIX.1-2001).

EPFNOSUPPORT
    Nieobsługiwana rodzina protokołów.

EPIPE
    Przerwany potok (POSIX.1-2001).

EPROTO
    Błąd protokołu (POSIX.1-2001).

EPROTONOSUPPORT
    Protokół nieobsługiwany (POSIX.1-2001).

EPROTOTYPE
    Typ protokołu nie pasuje do gniazda (POSIX.1-2001).

ERANGE
    Za duży wynik (POSIX.1, C99).

EREMCHG
    Zmienił się adres drugiego końca.

EREMOTE
    Obiekt jest obiektem zdalnym (podmontowanym przez NFS).

EREMOTEIO
    Błąd wejścia/wyjścia w odległym systemie.

ERESTART
    Należy wznowić przerwane wywołanie systemowe.

ERFKILL
    Operacja niemożliwa ze względu na RF-kill.

EROFS
    System plików wyłącznie do odczytu (POSIX.1-2001).

ESHUTDOWN
    Wysyłanie po zamknięciu gniazda jest niemożliwe.

ESPIPE
    Błędne przesunięcie (POSIX.1-2001).

ESOCKTNOSUPPORT
    Nieobsługiwany typ gniazda.

ESRCH
    Nie ma takiego procesu (POSIX.1-2001).

ESTALE
    Nieaktualny uchwyt pliku (POSIX.1-2001).

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

ETOOMANYREFS
    Za dużo odniesień: dowiązanie niemożliwe.

ETXTBSY
    Plik tekstowy zajęty (POSIX.1-2001).

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

EXDEV
    Błędne dowiązanie pomiędzy różnymi urządzeniami (POSIX.1-2001).

EXFULL
    Przepełniona wymiana.

UWAGI
Powszechnym błędem jest robienie

    if (jakieśwywołanie() == -1) {
        printf("jakieśwywołanie() zwróciło błąd\n");
        if (errno == ...) { ...; }
    }

ponieważ errno niekoniecznie musi mieć tę samą wartość, jaką miało po powrocie z jakieśwywołanie() (tj. mogła zostać zmieniona przez printf(3)). Jeżeli wartość errno powinna być utrzymana pomiędzy wywołaniami funkcji, musi być zachowywana:

    if (jakieśwywołanie() == -1) {
        int errsv = errno;
        printf("jakieśwywołanie() zwróciło błąd\n");
        if (errsv == ...) { ...; }
    }

Proszę zauważyć, że API wątków POSIX nie ustawia errno w razie wystąpienia błędu. Przy niepowodzeniu ustawiany jest numer błędu jako wynik funkcji. Te numery błędów mają takie samo znaczenie, jak numery błędów zwracane w errno przez inne interfejsy programistyczne.

Na niektórych antycznych systemach <errno.h> był nieobecny lub nie deklarował errno, tak że trzeba było zadeklarować errno samemu (tj. extern int errno). Nie należy tego robić. Już od dawna nie ma takiej potrzeby, a może powodować problemy, gdy są używane nowoczesne wersje biblioteki C.

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

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Adam Byrtek <alpha@irc.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Paweł Krawczyk (eglibc) <kravietz@ceti.pl>, Jakub Bogusz (eglibc) <qboosh@pld-linux.org>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.