errno – mechanizm zgłaszania błędów przez funkcje libc, a w szczególności jądra. Jeśli funkcja zakończy się błędem, sygnalizuje to zwracając zwykle -1 lub, w przypadku funkcji zwracających wskaźnik, NULL. Program powinien wtedy zajrzeć do zmiennej globalnej errno, żeby dowiedzieć się, jaki dokładnie błąd wystąpił. Jeśli funkcja zakończy się pomyślnie, zawartość errno nie jest zdefiniowana – w szczególności może tam znajdować się kod błędu niezwiązany z ostatnim wywołaniem danej funkcji. Ma to miejsce np. w przypadku, gdy funkcja foo wywoła funkcję bar, przy czym ta druga zwróci błąd, co jednak nie przeszkodzi pierwszej w pomyślnym wykonaniu. Może się też zdarzyć, że pomyślne wywołanie funkcji potencjalnie modyfikującej errno nie zmieni poprzedniej wartości tej zmiennej.

Zmienna errno jest zdefiniowana w nagłówku errno.h.

Popularne kody błędów to: EACCES – odmowa dostępu EAGAIN – zasób tymczasowo niedostępny EBADF – niepoprawny deskryptor plików EINTR – podczas wykonywania funkcji nastąpiło przerwanie EINVAL – błędny argument ENOTSUP – operacja nie jest zaimplementowana EPERM – operacja niedozwolona EPIPE – przerwany potok

Opis błędu w odpowiednim dla danego locale języku można otrzymać za pomocą funkcji: char *strerror(int errnum);

Niestety nie jest ona bezpieczna w programach wielowątkowych, gdzie należy korzystać z trudniejszej w użyciu: int strerror_r(int errnum, char *buf, size_t n);

Przykład #include <stdio.h> #include <stdlib.h> #include <errno.h>

int main(int argc, char **argv) { int files = argc - 1; FILE *file; char *fname; int i;

if (!files) { fprintf(stderr, "Usage: %s <files>\n", argv); return 1;

for (i = 1; i <= files; ++i) { fname = argv[i]; file = fopen(fname, "r"); if (file == NULL) { fprintf(stderr, "Error while trying to open '%s': %s\n", fname, strerror(errno)); } else { fprintf (stderr, "'%s' opened successfully\n", fname); fclose (file);

return 0; }

Przypisy

Kategoria:Unix