Programowanie w języku C/C++

Errno

  • 2010-10-31 18:27
  • 0 komentarzy
  • 1962 odsłony
  • Oceń ten tekst jako pierwszy
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:

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