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

```c #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:

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

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

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

W celu poinformowania użytkownika o błędzie możemy użyć funkcji [[C/perror]]. Opis danego błędu możemy uzyskać za pomocą funkcji [[C/strerror]] lub [[C/strerror_r]]. Jak widać [[C/perror]] po dwukropku sam dodaje treść błędu, zapisanego pod zmienną <var>errno</var>.

____
<b>Zobacz też:</b>
* [[C/perror]]
* [[C/strerror]]
* [[C/strerror_r]]
* [[C/clearerr]]
* [[C/stderr]]

0 komentarzy