Errno

ceer
extern int errno;

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

Prosze podac dowolna liczbe:
2
Podana liczba, podniesiona do kwadratu daje: 4

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

Prosze podac dowolna liczbe:
@
Nie udalo sie podniesc liczby do kwadratu: Invalid argument

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