Scroll to navigation

ERRNO(3) Funkcje biblioteczne 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.

Lista argumentów za długa
Brak dostępu
Adres jest używany
Adres niedostępny
Niewspierana rodzina adresów
Zasoby chwilowo niedostępne
Połączenie trwa
Błędny deskryptor pliku
Błędny komunikat
Zasób zajęty
Operacja anulowana
Brak procesów potomnych
Połączenie przerwane
Odmowa połączenia
Połączenie zrestartowane
Uniknięto zakleszczenia zasobów
Wymagany jest adres docelowy
Błąd dziedziny
Zarezerwowane
Plik istnieje
Błędny adres
Plik jest za duży
Host jest nieosiągalny
Usunięto identyfikator
Nieprawidłowa kolejność bajtów
Operacja jest już wykonywana
Przerwane wywołanie funkcji
Zły argument
Błąd wejścia/wyjścia
Gniazdo jest połączone
Jest katalogiem
Za dużo poziomów dowiązań symbolicznych
Za dużo otwartych plików
Za dużo dowiązań
Nieodpowiednia długość bufora komunikatów
Zarezerwowane
Za długa nazwa pliku
Sieć jest wyłączona
Połączenie przerwane przez sieć
Sieć jest niedostępna
Za dużo otwartych plików w systemie
Brak dostępnej przestrzeni buforów
Brak komunikatów w nagłówku czytanej kolejki STREAM
Nie ma takiego urządzenia
Nie ma takiego pliku ani katalogu
Błędny format pliku wykonywalnego
Brak dostępnych blokad
Zarezerwowane
Brak miejsca
Brak komunikatów zadanego rodzaju
Protokół jest niedostępny
Brak miejsca na urządzeniu
Brak zasobów STREAM
To nie jest STREAM
Niezaimplementowana funkcja
Gniazdo nie jest połączone
To nie jest katalog
Katalog nie jest pusty
To nie jest gniazdo
Niedostępne
Nieodpowiednia operacja kontroli wejścia/wyjścia
Brak urządzenia lub adresu
Operacja niedozwolona na gnieździe
Wartość za duża dla typu danych
Operacja niedozwolona
Przerwany potok
Błąd protokołu
Protokół nie wspierany
Niewłaściwy rodzaj protokołu dla gniazda
Rezultat zbyt duży
System plików wyłącznie do odczytu
Nieprawidłowe przesunięcie
Nie ma takiego procesu
Zarezerwowane
Timeout ioctl() dla STREAM
Operacja przeterminowana
Plik tekstowy jest zajęty
Operacja blokująca (może to być ta sama wartość, co dla EAGAIN)
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)

2004-12-17