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[1]. 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ępuEAGAIN
– zasób tymczasowo niedostępnyEBADF
– niepoprawny deskryptor plikówEINTR
– podczas wykonywania funkcji nastąpiło przerwanieEINVAL
– błędny argumentENOTSUP
– operacja nie jest zaimplementowanaEPERM
– operacja niedozwolonaEPIPE
– przerwany potokOpis 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);