мета-данные страницы
Это старая версия документа!
errno.h
заголовочник, предоставляющий механизм сигнализации и диагностики ошибок через глобальную переменную и набор макросов-кодов ошибок. Используется совместно с системными и библиотечными вызовами для понимания причин неуспешных операций.
определения:
#include <errno.h> extern int errno; /* глобальная переменная с кодом последней ошибки */ #define EDOM /* аргумент вне области определения (матем. функции) */ #define ERANGE /* результат вне диапазона представимых значений */ #define EILSEQ /* некорректная последовательность байтов (напр., при преобразовании кодировок) */ #define EACCES /* отказ в доступе (файлы/ресурсы) */ #define ENOENT /* файл или каталог не найден */ #define EEXIST /* файл уже существует */ #define ENOMEM /* недостаточно памяти */ #define EBADF /* неверный файловый дескриптор */ #define EAGAIN /* ресурс временно недоступен (повторите позже) */ #define EINTR /* операция прервана сигналом */ #define EINVAL /* невалидный аргумент */ #define EIO /* ошибка ввода-вывода */ #define ENOSPC /* недостаточно места на устройстве */ #define EPIPE /* запись в pipe без читателя */ char *strerror(int errnum); /* получить строковое описание кода ошибки */ int strerror_r(int errnum, char *buf, size_t buflen); /* потокобезопасная версия (две реализации: POSIX/GNU) */ void perror(const char *s); /* вывести сообщение об ошибке на stderr (s: префикс) */
понятия:
- errno — глобальный код ошибки, устанавливается функциями при неудаче.
- Макросы E* — символические кодовые имена ошибок (платформо-зависимы в наборе и значениях).
- strerror/strerror_r — преобразование кода ошибки в человекочитаемую строку.
- perror — простой вывод сообщения об ошибке с использованием errno.
- Виды ошибок — ошибки файловой системы, памяти, аргументов, ввода/вывода, прерываний и др.
- Потокобезопасность — errno зачастую реализуется как макрос, дающий поток-локальную переменную; strerror не потокобезопасна, strerror_r — предпочтительна.
особенности:
- errno имеет значение только после вызова функции, которая явно его устанавливает; при успехе значение не обнуляется автоматически.
- Проверяйте возвращаемое значение функции (например, -1 или NULL) перед чтением errno.
- Значения и набор кодов ошибок могут различаться между системами; полагаться на конкретные численные значения не рекомендуется — используйте макросы.
- strerror_r имеет две несовместимые реализации: POSIX (возвращает 0 при успехе и заполняет буфер) и GNU (возвращает указатель на строку — возможно внутр. статическая строка).
- Не записывайте прямо в errno; присваивание может иметь смысл только при реализации или для тестирования, но обычно errno устанавливается системой/библиотекой.
- При написании многопоточных программ используйте потоко-локальные errno и потокобезопасные функции описания ошибок.
пример использования:
#include <stdio.h> #include <errno.h> #include <string.h> int main(void) { FILE *f = fopen("no_such_file.txt", "r"); if (!f) { /* errno установлен функцией fopen */ perror("fopen"); /* выводит "fopen: <текст ошибки>" */ /* или получить строку безопасно */ char buf[128]; #if defined(__GLIBC__) /* GNU-специфично: strerror_r может вернуть указатель */ char *msg = strerror_r(errno, buf, sizeof buf); fprintf(stderr, "Ошибка: %s\n", msg); #else if (strerror_r(errno, buf, sizeof buf) == 0) fprintf(stderr, "Ошибка: %s\n", buf); #endif return 1; } fclose(f); return 0; }