Manpages

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>.