Scroll to navigation

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:

Nazwa jest definiowana przez POSIX.1-2001, jak i przez późniejsze wersje standardu POSIX.1, chyba że zaznaczono, że jest inaczej.
Nazwa jest definiowana przez POSIX.1-2008, ale nie była obecna we wcześniejszych standardach POSIX.1.
Nazwa jest zdefiniowana przez standard C99.

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

Lista argumentów za długa (POSIX.1-2001).
Brak dostępu (POSIX.1-2001).
Adres jest już w użyciu (POSIX.1-2001).
Niedostępny adres (POSIX.1-2001).
Rodzina adresów nieobsługiwana (POSIX.1-2001).
Zasoby chwilowo niedostępne (może mieć tę samą wartość, co EWOULDBLOCK) (POSIX.1-2001).
Operacja jest już wykonywana (POSIX.1-2001).
Błędna wymiana.
Błędny deskryptor pliku (POSIX.1-2001).
Deskryptor pliku w złym stanie.
Błędny komunikat (POSIX.1-2001).
Błędny deskryptor żądania.
Zły kod żądania.
Błędny kanał.
Urządzenie lub zasoby zajęte (POSIX.1-2001).
Operacja anulowana (POSIX.1-2001).
Brak procesów potomnych (POSIX.1-2001).
Numer kanału poza zakresem.
Błąd komunikacji podczas wysyłania.
Połączenie przerwane (POSIX.1-2001).
Połączenie odrzucone (POSIX.1-2001).
Połączenie zerwane (przez drugą stronę) (POSIX.1-2001).
Uniknięto zakleszczenia zasobów (POSIX.1-2001).
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”.
Wymagany jest adres docelowy (POSIX.1-2001).
Argument spoza dziedziny funkcji matematycznej (POSIX.1, C99).
Przekroczony limit dyskowy (POSIX.1-2001).
Plik istnieje (POSIX.1-2001).
Błędny adres (POSIX.1-2001).
Plik zbyt duży (POSIX.1-2001).
Urządzenie jest wyłączone.
Brak trasy do hosta (POSIX.1-2001).
Strona pamięci ma błąd sprzętowy.
Identyfikator został usunięty (POSIX.1-2001).
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”.
Operacja jest właśnie wykonywana (POSIX.1-2001).
Przerwane wywołanie systemowe (POSIX.1-2001); patrz signal(7)
Zły argument (POSIX.1-2001).
Błąd wejścia/wyjścia (POSIX.1-2001).
Gniazdo już jest połączone (POSIX.1-2001).
Jest katalogiem (POSIX.1-2001).
Jest plikiem nazwanym.
Klucz wygasł.
Klucz został odrzucony przez usługę.
Klucz został unieważniony.
Poziom 2 zatrzymany.
Poziom 2 niezsynchronizowany.
Poziom 3 zatrzymany.
Poziom 3 zatrzymany.
Brak dostępu do wymaganej biblioteki dzielonej.
Próba użycia uszkodzonej biblioteki dzielonej.
Próba łączenia ze zbyt wieloma bibliotekami dzielonymi.
Sekcja .lib w a.out jest uszkodzona.
Nie można bezpośrednio uruchomić biblioteki dzielonej.
Numer kanału poza zakresem.
Za duże zagnieżdżenie dowiązań symbolicznych (POSIX.1-2001).
Niewłaściwy typ medium.
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.
Za dużo dowiązań (POSIX.1-2001).
Komunikat za długi (POSIX.1-2001).
Próba przejścia przez zbyt wiele ruterów (POSIX.1-2001).
Za długa nazwa pliku (POSIX.1-2001).
Sieć jest wyłączona (POSIX.1-2001).
Połączenie zerwane przez sieć (POSIX.1-2001).
Sieć jest niedostępna (POSIX.1-2001).
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)).
„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./
Brak miejsca w buforze (POSIX.1 (opcja XSI STREAMS)).
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”
Nie ma takiego urządzenia (POSIX.1-2001).
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.
Błędny format pliku wykonywalnego (POSIX.1-2001).
Wymagany klucz niedostępny.
Brak dostępnych blokad (POSIX.1-2001).
Połączenie zostało przerwane (POSIX.1-2001).
Brak medium.
Za mało miejsca/nie można przydzielić pamięci (POSIX.1-2001).
Brak komunikatu o pożądanym typie (POSIX.1-2001).
Maszyna nie znajduje się w tej sieci.
Pakiet nie jest zainstalowany.
Protokół niedostępny (POSIX.1-2001).
Brak miejsca na urządzeniu (POSIX.1-2001).
Brak dodatkowych strumieni (POSIX.1 (opcja XSI STREAMS)).
Nie jest strumieniem (POSIX.1 (opcja XSI STREAMS)).
Niezaimplementowana funkcja (POSIX.1-2001).
Wymagane urządzenie blokowe.
Drugi koniec nie jest połączony (POSIX.1-2001).
Nie jest katalogiem (POSIX.1-2001).
Katalog nie jest pusty (POSIX.1-2001).
Stan bez możliwości wyjścia (POSIX.1-2008).
Nie jest gniazdem (POSIX.1-2001).
Operacja nieobsługiwana (POSIX.1-2001).
Niewłaściwa operacja kontrolna (ioctl) wejścia/wyjścia (POSIX.1-2001).
Nazwa nie jest unikatowa w sieci.
Nie ma takiego urządzenia ani adresu (POSIX.1-2001).
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ć)
Wartość za duża dla zdefiniowanego typu danych (POSIX.1-2001).
Właściciel zmarł (POSIX.1-2008).
Operacja niedozwolona (POSIX.1-2001).
Nieobsługiwana rodzina protokołów.
Przerwany potok (POSIX.1-2001).
Błąd protokołu (POSIX.1-2001).
Protokół nieobsługiwany (POSIX.1-2001).
Typ protokołu nie pasuje do gniazda (POSIX.1-2001).
Za duży wynik (POSIX.1, C99).
Zmienił się adres drugiego końca.
Obiekt jest obiektem zdalnym (podmontowanym przez NFS).
Błąd wejścia/wyjścia w odległym systemie.
Należy wznowić przerwane wywołanie systemowe.
Operacja niemożliwa ze względu na RF-kill.
System plików wyłącznie do odczytu (POSIX.1-2001).
Wysyłanie po zamknięciu gniazda jest niemożliwe.
Błędne przesunięcie (POSIX.1-2001).
Nieobsługiwany typ gniazda.
Nie ma takiego procesu (POSIX.1-2001).
Nieaktualny uchwyt pliku (POSIX.1-2001).
Ten błąd może wystąpić na systemie plików NFS i na innych systemach plików.
Błąd potoku biblioteki strumieni.
Upłynął czas stopera (POSIX.1 (opcja XSI STREAMS)).
(POSIX.1 mówi „Przekroczenie czasu STREAM ioctl(2)”).
Przekroczony czas oczekiwania na połączenie (POSIX.1-2001).
Za dużo odniesień: dowiązanie niemożliwe.
Plik tekstowy zajęty (POSIX.1-2001).
Struktura wymaga wyczyszczenia.
Sterownik protokołu nie jest podłączony.
Za dużo użytkowników.
Operacja zostałaby zablokowana (może mieć tę samą wartość, co EAGAIN) (POSIX.1-2001).
Błędne dowiązanie pomiędzy różnymi urządzeniami (POSIX.1-2001).
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

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)