errno

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

errnouniksowy 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. Ma to miejsce np. w przypadku jeśli funkcja foo wywołała funkcje bar, przy czym ta druga zwróciła błąd, co jednak nie przeszkodziło pierwszej w pomyślnym wykonaniu.

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 używać trudniejszej w użyciu:

int strerror_r(int errnum, char *buf, size_t n);

Przykład[edytuj | edytuj kod]

#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[0]);
                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;
}