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 |
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.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/.
TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Adam Byrtek <alpha [AT] irc.pl>, Andrzej Krzysztofowicz <ankry [AT] green.pl>, Paweł Krawczyk (eglibc) <kravietz [AT] ceti.pl>, Jakub Bogusz (eglibc) <qboosh [AT] pld-linux.org>, Robert Luberda <robert [AT] debian.org> i Michał Kułach <michal.kulach [AT] 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 [AT] lists.net>.