Errno

ceer
extern int errno;
<justify>Jak wiadomo, język ANSI C pozbawiony jest obsługi wyjątków. W związku z tym obsługa błędów polega jedynie na tym, że większość funkcji bibliotecznych zwraca specjalną wartość oznaczającą, że operacja się nie powiodła. Ta specjalna wartość może być równa -1, być pustym wskaźnikiem (NULL) lub stałą taką jak EOF zdefiniowaną specjalnie w tym celu. Jednak na podstawie tej wartości możemy się jedynie zorientować, że błąd nastąpił. Żeby dowiedzieć się, co konkretnie było skutkiem niepowodzenia, należy odczytać wartość specjalnej zmiennej globalnej errno, zadeklarowanej w pliku nagłówkowym errno.h. Początkowa wartość errno po uruchomieniu programu wynosi zero.</justify><justify> Głównym założeniem zmiennej jest to, że wiele funkcji bibliotecznych ustawia ją na pewną wartość niezerową po napotkaniu różnego rodzajów błędów. Błędy te są wyspecyfikowanie w opisie każdej z funkcji.</justify> Funkcje nie zmieniają wartości errno kiedy ich wywołanie się powiedzie, dlatego wartość zmiennej errno po bezbłędnym wykonaniu funkcji nie musi być zerowa. Nie należy zatem używać errno w celu stwierdzenia, czy dane wywołanie funkcji się powiodło. Jeżeli będzie miało miejsce niepowodzenie, funkcja sama powinna to zakomunikować.

Najczęściej przyjmowane wartości

0 - sukces (brak błędu)
EACCES - odmowa dostępu
EAGAIN - zasób tymczasowo niedostępny
EBADF - niepoprawny deskryptor plików
ECANCELED - operacja anulowana
EDOM - błąd zakresu argumentów przy wywoływaniu funkcji matematycznych
EEXIST - plik istnieje
EILSEQ - napotkano błędną reprezentację wielobajtowego znaku
EINTR - podczas wykonywania funkcji nastąpiło przerwanie
EINVAL - błędny argument
EMFILE - za dużo otwartych plików
ENOENT - nie ma takiego pliku albo katalogu
ENOMEM - brak miejsca w pamięci
ENOTEMPTY - katalog nie jest pusty
ENOTSUP - operacja nie jest zaimplementowana
EPERM - operacja nie dozwolona
EPIPE - przerwany potok
ERANGE - wynik działania funkcji matematycznych nie mieści się w typie wyniku

Przykład wykorzystania zmiennej globalnej errno

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
 
int main (int argc, char* argv[])
{
   int liczba;
   printf ("Prosze podac dowolna liczbe: \n");
   if ( scanf ("%d", &liczba) == 0 )
   {
        errno = EINVAL;
        perror ("Nie udalo sie podniesc liczby do kwadratu");
        return 1;
    }
    else
        liczba *= liczba;
    printf ("Podana liczba, podniesiona do kwadratu daje: %d\n", liczba);
    return 0;
}

Powyższy przykład jest iście banalny i ma za zadanie podnieść podaną liczbę do kwadratu.
W przypadku podania dwójki, działanie funkcji będzie wyglądało następująco:

<font size="3"><font color="gray">Prosze podac dowolna liczbe:
2
Podana liczba, podniesiona do kwadratu daje: 4</span></span>

Podanie nieprawidłowej wartości, np. znaku '@' będzie skutkowało błędem:

<font size="3"><font color="gray">Prosze podac dowolna liczbe:
@
Nie udalo sie podniesc liczby do kwadratu: Invalid argument</span></span>

W celu poinformowania użytkownika o błędzie możemy użyć funkcji Perror. Opis danego błędu możemy uzyskać za pomocą funkcji Strerror lub Strerror r. Jak widać Perror po dwukropku sam dodaje treść błędu, zapisanego pod zmienną errno.


Zobacz też:

0 komentarzy