errno - numer ostatniego błędu
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.
- E2BIG
- Lista argumentów za długa (POSIX.1)
- EACCES
- Brak dostępu (POSIX.1)
- EADDRINUSE
- Adres jest już w użyciu (POSIX.1)
- EADDRNOTAVAIL
- Niedostępny adres (POSIX.1)
- EAFNOSUPPORT
- Rodzina adresów nieobsługiwana (POSIX.1)
- EAGAIN
- Zasoby chwilowo niedostępne (może mieć tę
samą wartość co EWOULDBLOCK) (POSIX.1)
- EALREADY
- Operacja jest już wykonywana (POSIX.1)
- EBADE
- Błędna wymiana
- EBADF
- Błędny deskryptor pliku (POSIX.1)
- EBADFD
- Deskryptor pliku w złym stanie
- EBADMSG
- Błędny komunikat (POSIX.1)
- EBADR
- Błędny deskryptor żądania
- EBADRQC
- Zły kod żądania
- EBADSLT
- Błędny kanał
- EBUSY
- Urządzenie lub zasoby zajęte (POSIX.1)
- ECANCELED
- Operacja anulowana (POSIX.1)
- ECHILD
- Brak procesów potomnych (POSIX.1)
- ECHRNG
- Numer kanału poza zakresem
- ECOMM
- Błąd komunikacji podczas wysyłania
- ECONNABORTED
- Połączenie przerwane (POSIX.1)
- ECONNREFUSED
- Połączenie odrzucone (POSIX.1)
- ECONNRESET
- Połączenie zerwane (przez drugą stronę)
(POSIX.1)
- EDEADLK
- Uniknięto zakleszczenia zasobów (POSIX.1)
- EDEADLOCK
- Synonim EDEADLK
- EDESTADDRREQ
- Wymagany jest adres docelowy (POSIX.1)
- EDOM
- Argument spoza dziedziny funkcji matematycznej (POSIX.1, C99)
- EDQUOT
- Przekroczony limit dyskowy (POSIX.1)
- EEXIST
- Plik istnieje (POSIX.1)
- EFAULT
- Błędny adres (POSIX.1)
- EFBIG
- Plik zbyt duży (POSIX.1)
- EHOSTDOWN
- Urządzenie jest wyłączone
- EHOSTUNREACH
- Host jest niedostępny (POSIX.1)
- EIDRM
- Identyfikator został usunięty (POSIX.1)
- EILSEQ
- Niepoprawna sekwencja bajtów (POSIX.1, C99)
- EINPROGRESS
- Operacja jest właśnie wykonywana (POSIX.1)
- EINTR
- Przerwane wywołanie systemowe (POSIX.1); patrz
signal(7)
- EINVAL
- Zły argument (POSIX.1)
- EIO
- Błąd wejścia/wyjścia (POSIX.1)
- EISCONN
- Gniazdo już jest połączone (POSIX.1)
- EISDIR
- Jest katalogiem (POSIX.1)
- 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
- ELOOP
- Za duże zagnieżdżenie dowiązań
symbolicznych (POSIX.1)
- EMEDIUMTYPE
- Niewłaściwy typ medium
- EMFILE
- Zbyt wiele otwartych plików (POSIX.1); zwykle spowodowane
przekroczeniem limitu zasobów RLIMIT_NOFILE opisanego w
getrlimit(2)
- EMLINK
- Za dużo dowiązań (POSIX.1)
- EMSGSIZE
- Komunikat za długi (POSIX.1)
- EMULTIHOP
- Próba przejścia przez zbyt wiele ruterów
(POSIX.1)
- ENAMETOOLONG
- Za długa nazwa pliku (POSIX.1)
- ENETDOWN
- Sieć jest wyłączona (POSIX.1)
- ENETRESET
- Połączenie zerwane przez sieć (POSIX.1)
- ENETUNREACH
- Sieć jest niedostępna (POSIX.1)
- ENFILE
- Zbyt wiele otwartych plików (POSIX.1); pod Linuksem zwykle jest to
rezultat natrafienia na limit /proc/sys/fs/file-max (zob.
proc(5)).
- ENOBUFS
- Brak miejsca w buforze (POSIX.1 (opcja XSI STREAMS))
- ENODATA
- Brak dostępnych komunikatów w głównej kolejce
odczytu strumieni (POSIX.1)
- ENODEV
- Nie ma takiego urządzenia (POSIX.1)
- ENOENT
- 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.
- ENOEXEC
- Błędny format pliku wykonywalnego (POSIX.1)
- ENOKEY
- Wymagany klucz niedostępny
- ENOLCK
- Brak dostępnych blokad (POSIX.1)
- ENOLINK
- Połączenie zostało przerwane (POSIX.1)
- ENOMEDIUM
- Brak medium
- ENOMEM
- Nie można przydzielić pamięci (POSIX.1)
- ENOMSG
- Brak komunikatu o pożądanym typie (POSIX.1)
- ENONET
- Maszyna nie znajduje się w tej sieci
- ENOPKG
- Pakiet nie jest zainstalowany
- ENOPROTOOPT
- Protokół niedostępny (POSIX.1)
- ENOSPC
- Brak miejsca na urządzeniu (POSIX.1)
- ENOSR
- Brak dodatkowych strumieni (POSIX.1 (opcja XSI STREAMS))
- ENOSTR
- Nie jest strumieniem (POSIX.1 (opcja XSI STREAMS))
- ENOSYS
- Niezaimplementowana funkcja (POSIX.1)
- ENOTBLK
- Wymagane urządzenie blokowe
- ENOTCONN
- Drugi koniec nie jest połączony (POSIX.1)
- ENOTDIR
- Nie jest katalogiem (POSIX.1)
- ENOTEMPTY
- Katalog nie jest pusty (POSIX.1)
- ENOTSOCK
- Nie jest gniazdem (POSIX.1)
- ENOTSUP
- Operacja nieobsługiwana (POSIX.1)
- ENOTTY
- Niewłaściwa operacja kontrolna (ioctl)
wejścia/wyjścia (POSIX.1)
- ENOTUNIQ
- Nazwa nie jest unikatowa w sieci
- ENXIO
- Nie ma takiego urządzenia ani adresu (POSIX.1)
- EOPNOTSUPP
- 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ć)
- EOVERFLOW
- Wartość za duża dla zdefiniowanego typu danych
(POSIX.1)
- EPERM
- Operacja niedozwolona (POSIX.1)
- EPFNOSUPPORT
- Nieobsługiwana rodzina protokołów
- EPIPE
- Przerwany potok (POSIX.1)
- EPROTO
- Błąd protokołu (POSIX.1)
- EPROTONOSUPPORT
- Protokół nieobsługiwany (POSIX.1)
- EPROTOTYPE
- Typ protokołu nie pasuje do gniazda (POSIX.1)
- ERANGE
- Za duży wynik (POSIX.1, C99)
- EREMCHG
- Zmienił się adres drugiego końca
- EREMOTE
- Zdalny obiekt jest obiektem podmontowanym przez NFS
- EREMOTEIO
- Błąd wejścia/wyjścia w odległym
systemie
- ERESTART
- Należy wznowić przerwane wywołanie systemowe
- EROFS
- System plików wyłącznie do odczytu (POSIX.1)
- ESHUTDOWN
- Wysyłanie po zamknięciu gniazda jest niemożliwe
- ESPIPE
- Błędne przesunięcie (POSIX.1)
- ESOCKTNOSUPPORT
- Nieobsługiwany typ gniazda
- ESRCH
- Nie ma takiego procesu (POSIX.1)
- ESTALE
- Nieaktualny uchwyt pliku (POSIX.1)
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)
- ETXTBSY
- Plik tekstowy zajęty (POSIX.1)
- 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)
- EXDEV
- Niepoprawne dowiązanie (POSIX.1)
- 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 == ...) { ... }
}
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.
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.