errno
Z Wikipedii
errno to uniksowy 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.
Wtedy program powinien 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 nie dozwolona
- 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);
[edytuj] 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[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; }