Scroll to navigation

ERRNO(3) Podręcznik programisty Linuksa 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: Nazwa jest definiowana 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
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
Zbyt wiele otwartych plików (POSIX.1-2001); zwykle spowodowane przekroczeniem limitu zasobów RLIMIT_NOFILE opisanego w getrlimit(2).
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
Brak dostępnych komunikatów w głównej kolejce odczytu strumieni (POSIX.1-2001).
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 == ...) { ... }
}


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

10 października 2019 r.