errno

Autres langues

Langue: pl

Autres versions - même langue

Version: 2004-12-17 (fedora - 25/11/07)

Autres sections - même nom

Section: 3 (Bibliothèques de fonctions)

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)