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.
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
W poniższej liście symbolicznych nazw
błędów, pewne nazwy oznaczono w
następujący sposób:
- POSIX.1-2001
- The name is defined by POSIX.1-2001, and is defined in later POSIX.1
versions, unless otherwise indicated.
- POSIX.1-2008
- The name is defined in POSIX.1-2008, but was not present in earlier
POSIX.1 standards.
- 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.
- 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
- Too many open files (POSIX.1-2001). Commonly caused by exceeding the
RLIMIT_NOFILE resource limit described in getrlimit(2). Can
also be caused by exceeding the limit specified in
/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
- Brak anody.
- ENOBUFS
- Brak miejsca w buforze (POSIX.1 (opcja XSI STREAMS)).
- ENODATA
- The named attribute does not exist, or the process has no access to this
attribute; see xattr(7).
- In POSIX.1-2001 (XSI STREAMS option), this error was described as "No
message is available on the STREAM head read queue".
- 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
- Invalid cross-device link (POSIX.1-2001).
- EXFULL
- 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 == ...) { ... }
}
Note that the POSIX threads APIs do not set errno on
error. Instead, on failure they return an error number as the function
result. These error numbers have the same meanings as the error numbers
returned in errno by other APIs.
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.
errno(1), err(3), error(3), perror(3),
strerror(3)
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.