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. 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
- Za dużo otwartych plików (POSIX.1)
- 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
- Za dużo otwartych plików w systemie (POSIX.1)
- 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)
- 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
UWAGI
Powszechnym błędem jest robienieif (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.
O STRONIE
Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów, oraz najnowszą wersję oryginału można znaleźć pod adresem http://www.kernel.org/doc/man-pages/.TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Adam Byrtek (PTM) <[email protected]>, Andrzej Krzysztofowicz (PTM) <[email protected]>, Paweł Krawczyk (eglibc) <[email protected]>, Jakub Bogusz (eglibc) <[email protected]> i Robert Luberda <[email protected]>.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ą 3.71 oryginału.