table of contents
errno(3) | Library Functions Manual | 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¶
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 listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.
2 maja 2024 r. | Linux man-pages (niewydane) |