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.

  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.

All the error names specified by POSIX.1 must have distinct values, with the exception of EAGAIN and EWOULDBLOCK, which may be the same. On Linux, these two have the same value on all architectures.

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: The name is defined by C99.

Below is a list of the symbolic error names that are defined on Linux:

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
    On most architectures, a synonym for EDEADLK. On some architectures (e.g., Linux MIPS, PowerPC, SPARC), it is a separate error code "File locking deadlock error".

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.

ELNRANGE
    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
    Too many open files (POSIX.1-2001). Commonly caused by exceeding the RLIMIT_NOFILE resource limit described in getrlimit(2). Can also be caused by exceeding the limit specified in /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
    Brak anody.

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

ENODATA
    The named attribute does not exist, or the process has no access to this attribute; see xattr(7).

    In POSIX.1-2001 (XSI STREAMS option), this error was described as "No message is available on the STREAM head read queue".

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
    Niepoprawne dowiązanie (POSIX.1-2001).

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 == ...) { ... }
    }

Note that the POSIX threads APIs do not set errno on error. Instead, on failure they return an error number as the function result. These error numbers have the same meanings as the error numbers returned in errno by other APIs.

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)

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

TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: 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 manpages-pl-list@lists.sourceforge.net.