DOKK / manpages / debian 10 / manpages-pl-dev / errno.3.pl
ERRNO(3) Podręcznik programisty Linuksa ERRNO(3)

errno - numer ostatniego błędu

#include <errno.h>

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. Wartość ta jest istotna, tylko gdy wywołanie zwróciło błąd (tj. -1 w wypadku większości wywołań systemowych albo -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.

Poprawne numery błędów są niezerowe; żadne wywołanie systemowe lub funkcja biblioteczne nigdy nie ustawi 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.

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ść.

Poniżej przedstawiono listę nazw błędów, które są zdefiniowane pod Linuksem. Niektóre z nich oznaczono jako POSIX.1, wskazując, że nazwa błędu jest zdefiniowana przez POSIX.1-2001, lub jako C99, wskazując na nazwy błędów zdefiniowane przez C99.

Lista argumentów za długa (POSIX.1)
Brak dostępu (POSIX.1)
Adres jest już w użyciu (POSIX.1)
Niedostępny adres (POSIX.1)
Rodzina adresów nieobsługiwana (POSIX.1)
Zasoby chwilowo niedostępne (może mieć tę samą wartość co EWOULDBLOCK) (POSIX.1)
Operacja jest już wykonywana (POSIX.1)
Błędna wymiana
Błędny deskryptor pliku (POSIX.1)
Deskryptor pliku w złym stanie
Błędny komunikat (POSIX.1)
Błędny deskryptor żądania
Zły kod żądania
Błędny kanał
Urządzenie lub zasoby zajęte (POSIX.1)
Operacja anulowana (POSIX.1)
Brak procesów potomnych (POSIX.1)
Numer kanału poza zakresem
Błąd komunikacji podczas wysyłania
Połączenie przerwane (POSIX.1)
Połączenie odrzucone (POSIX.1)
Połączenie zerwane (przez drugą stronę) (POSIX.1)
Uniknięto zakleszczenia zasobów (POSIX.1)
Synonim EDEADLK
Wymagany jest adres docelowy (POSIX.1)
Argument spoza dziedziny funkcji matematycznej (POSIX.1, C99)
Przekroczony limit dyskowy (POSIX.1)
Plik istnieje (POSIX.1)
Błędny adres (POSIX.1)
Plik zbyt duży (POSIX.1)
Urządzenie jest wyłączone
Host jest niedostępny (POSIX.1)
Identyfikator został usunięty (POSIX.1)
Niepoprawna sekwencja bajtów (POSIX.1, C99)
Operacja jest właśnie wykonywana (POSIX.1)
Przerwane wywołanie systemowe (POSIX.1); patrz signal(7)
Zły argument (POSIX.1)
Błąd wejścia/wyjścia (POSIX.1)
Gniazdo już jest połączone (POSIX.1)
Jest katalogiem (POSIX.1)
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
Za duże zagnieżdżenie dowiązań symbolicznych (POSIX.1)
Niewłaściwy typ medium
Zbyt wiele otwartych plików (POSIX.1); zwykle spowodowane przekroczeniem limitu zasobów RLIMIT_NOFILE opisanego w getrlimit(2)
Za dużo dowiązań (POSIX.1)
Komunikat za długi (POSIX.1)
Próba przejścia przez zbyt wiele ruterów (POSIX.1)
Za długa nazwa pliku (POSIX.1)
Sieć jest wyłączona (POSIX.1)
Połączenie zerwane przez sieć (POSIX.1)
Sieć jest niedostępna (POSIX.1)
Zbyt wiele otwartych plików (POSIX.1); pod Linuksem zwykle jest to rezultat natrafienia na limit /proc/sys/fs/file-max (zob. proc(5)).
Brak miejsca w buforze (POSIX.1 (opcja XSI STREAMS))
Brak dostępnych komunikatów w głównej kolejce odczytu strumieni (POSIX.1)
Nie ma takiego urządzenia (POSIX.1)
Nie ma takiego pliku ani katalogu (POSIX.1)

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)
Wymagany klucz niedostępny
Brak dostępnych blokad (POSIX.1)
Połączenie zostało przerwane (POSIX.1)
Brak medium
Nie można przydzielić pamięci (POSIX.1)
Brak komunikatu o pożądanym typie (POSIX.1)
Maszyna nie znajduje się w tej sieci
Pakiet nie jest zainstalowany
Protokół niedostępny (POSIX.1)
Brak miejsca na urządzeniu (POSIX.1)
Brak dodatkowych strumieni (POSIX.1 (opcja XSI STREAMS))
Nie jest strumieniem (POSIX.1 (opcja XSI STREAMS))
Niezaimplementowana funkcja (POSIX.1)
Wymagane urządzenie blokowe
Drugi koniec nie jest połączony (POSIX.1)
Nie jest katalogiem (POSIX.1)
Katalog nie jest pusty (POSIX.1)
Nie jest gniazdem (POSIX.1)
Operacja nieobsługiwana (POSIX.1)
Niewłaściwa operacja kontrolna (ioctl) wejścia/wyjścia (POSIX.1)
Nazwa nie jest unikatowa w sieci
Nie ma takiego urządzenia ani adresu (POSIX.1)
Operacja na gnieździe nieobsługiwana (POSIX.1)

(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)
Operacja niedozwolona (POSIX.1)
Nieobsługiwana rodzina protokołów
Przerwany potok (POSIX.1)
Błąd protokołu (POSIX.1)
Protokół nieobsługiwany (POSIX.1)
Typ protokołu nie pasuje do gniazda (POSIX.1)
Za duży wynik (POSIX.1, C99)
Zmienił się adres drugiego końca
Zdalny obiekt jest obiektem podmontowanym przez NFS
Błąd wejścia/wyjścia w odległym systemie
Należy wznowić przerwane wywołanie systemowe
System plików wyłącznie do odczytu (POSIX.1)
Wysyłanie po zamknięciu gniazda jest niemożliwe
Błędne przesunięcie (POSIX.1)
Nieobsługiwany typ gniazda
Nie ma takiego procesu (POSIX.1)
Nieaktualny uchwyt pliku (POSIX.1)

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)
Plik tekstowy zajęty (POSIX.1)
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)
Niepoprawne dowiązanie (POSIX.1)
Przepełniona wymiana

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

Powszechnie w tradycyjnym C deklarowało się ręcznie errno (np. extern int errno) zamiast włączać plik <errno.h>. Nie rób tego. To nie będzie działało z nowoczesnymi wersjami biblioteki C. Jednakże na (bardzo) starych systemach Unix, <errno.h> może nie istnieć i ta deklaracja będzie potrzebna.

errno(1), err(3), error(3), perror(3), strerror(3)

Angielska wersja tej strony pochodzi z wydania 4.07 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/.

Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Adam Byrtek (PTM) <abyrtek@priv.onet.pl>, Andrzej Krzysztofowicz (PTM) <ankry@mif.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>.

Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 4.07 oryginału.

2016-03-15