ERRNO(3)

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. Wartość ta jest istotna tylko gdy wywołanie zwróciło błąd (zwykle -1), ale funkcja biblioteczna, która zakończyła się sukcesem, także może zmienić errno. Czasami, gdy -1 jest także poprawną wartością zwracaną, aby wykryć błędy należy przed wywołaniem wyzerować errno. errno jest definiowana przez standard ISO C jako modyfikowalna l-wartość typu int, które 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. Wszystkie poprawne numery błędów są różne od zera, funkcja biblioteczna nigdy nie przypisuje errno zera. 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ść. POSIX.1 (wydanie z 2001 roku) wyszczególnia następujące symboliczne nazwy błędów. Dwie z nich EDOM oraz ERANGE są zawarte także w standardzie ISO C. Pierwsza poprawka ISO C definiuje dodatkowy numer błędu EILSEQ dla kodowania błędów w wielobajtowych lub szerokich znakach.

E2BIG
    Lista argumentów za długa

EACCES
    Brak dostępu

EADDRINUSE
    Adres jest używany

EADDRNOTAVAIL
    Adres niedostępny

EAFNOSUPPORT
    Niewspierana rodzina adresów

EAGAIN
    Zasoby chwilowo niedostępne

EALREADY
    Połączenie trwa

EBADF
    Błędny deskryptor pliku

EBADMSG
    Błędny komunikat

EBUSY
    Zasób zajęty

ECANCELED
    Operacja anulowana

ECHILD
    Brak procesów potomnych

ECONNABORTED
    Połączenie przerwane

ECONNREFUSED
    Odmowa połączenia

ECONNRESET
    Połączenie zrestartowane

EDEADLK
    Uniknięto zakleszczenia zasobów

EDESTADDRREQ
    Wymagany jest adres docelowy

EDOM
    Błąd dziedziny

EDQUOT
    Zarezerwowane

EEXIST
    Plik istnieje

EFAULT
    Błędny adres

EFBIG
    Plik jest za duży

EHOSTUNREACH
    Host jest nieosiągalny

EIDRM
    Usunięto identyfikator

EILSEQ
    Nieprawidłowa kolejność bajtów

EINPROGRESS
    Operacja jest już wykonywana

EINTR
    Przerwane wywołanie funkcji

EINVAL
    Zły argument

EIO Błąd wejścia/wyjścia

EISCONN
    Gniazdo jest połączone

EISDIR
    Jest katalogiem

ELOOP
    Za dużo poziomów dowiązań symbolicznych

EMFILE
    Za dużo otwartych plików

EMLINK
    Za dużo dowiązań

EMSGSIZE
    Nieodpowiednia długość bufora komunikatów

EMULTIHOP
    Zarezerwowane

ENAMETOOLONG
    Za długa nazwa pliku

ENETDOWN
    Sieć jest wyłączona

ENETRESET
    Połączenie przerwane przez sieć

ENETUNREACH
    Sieć jest niedostępna

ENFILE
    Za dużo otwartych plików w systemie

ENOBUFS
    Brak dostępnej przestrzeni buforów

ENODATA
    Brak komunikatów w nagłówku czytanej kolejki STREAM

ENODEV
    Nie ma takiego urządzenia

ENOENT
    Nie ma takiego pliku ani katalogu

ENOEXEC
    Błędny format pliku wykonywalnego

ENOLCK
    Brak dostępnych blokad

ENOLINK
    Zarezerwowane

ENOMEM
    Brak miejsca

ENOMSG
    Brak komunikatów zadanego rodzaju

ENOPROTOOPT
    Protokół jest niedostępny

ENOSPC
    Brak miejsca na urządzeniu

ENOSR
    Brak zasobów STREAM

ENOSTR
    To nie jest STREAM

ENOSYS
    Niezaimplementowana funkcja

ENOTCON
    Gniazdo nie jest połączone

ENOTDIR
    To nie jest katalog

ENOTEMPTY
    Katalog nie jest pusty

ENOTSOCK
    To nie jest gniazdo

ENOTSUP
    Niedostępne

ENOTTY
    Nieodpowiednia operacja kontroli wejścia/wyjścia

ENXIO
    Brak urządzenia lub adresu

EOPNOTSUPP
    Operacja niedozwolona na gnieździe

EOVERFLOW
    Wartość za duża dla typu danych

EPERM
    Operacja niedozwolona

EPIPE
    Przerwany potok

EPROTO
    Błąd protokołu

EPROTONOSUPPORT
    Protokół nie wspierany

EPROTOTYPE
    Niewłaściwy rodzaj protokołu dla gniazda

ERANGE
    Rezultat zbyt duży

EROFS
    System plików wyłącznie do odczytu

ESPIPE
    Nieprawidłowe przesunięcie

ESRCH
    Nie ma takiego procesu

ESTALE
    Zarezerwowane

ETIME
    Timeout ioctl() dla STREAM

ETIMEDOUT
    Operacja przeterminowana

ETXTBSY
    Plik tekstowy jest zajęty

EWOULDBLOCK
    Operacja blokująca (może to być ta sama wartość, co dla EAGAIN)

EXDEV
    Nieprawidłowe dowiązanie

UWAGI
Powszechnym błędem jest robienie
    if (somecall() == -1) {
        printf("somecall() zwróciło błąd\n");
        if (errno == ...) { ... }
    }
gdzie errno niekoniecznie musi mieć tę samą wartość, jaką miało po powrocie z somecall() (tj. mogła zostać zmieniona przez printf()). 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,

ZOBACZ TAKŻE
perror(3), strerror(3)