errno - numer ostatniego błędu
Standardowa biblioteka C (libc, -lc)
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ść 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.
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
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.
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.
Tłumaczenie niniejszej strony podręcznika: 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.