errno

Глобальная переменная для значений ошибок

Прототип:

#include <errno.h>
extern int errno;
char * const sys_errlist[];
int sys_nerr;

Библиотека:

libc

Описание:

Переменная errno устанавливается в текущее значение ошибки многими функциями во время возникновения ошибки.


Note: Проверять значение переменной errno после вызова функции целесообразно только в том случае, если функция явно указывает на возникшую в процессе её выполнения ошибку (например, определённым значением возвращаемого результата). В противном случае значение errno недействительно. Также функции системной библиотеки никогда не сбрасывают значение errno в 0 в случае успешного выполнения.

В документации функции могут быть явно перечислены некоторые значения errno с уточнением их смысла. При этом функция потенциально может использовать и другие возможные значения для errno.


Переменная errno может быть реализована как макрос, но ее значение всегда можно проверить или установить, как если бы она была простым целочисленным значением.


Note: Каждый поток в многопоточной программе имеет собственное значение ошибки в своем локальном хранилище. Вне зависимости от того, в каком потоке Вы находитесь, Вы можете просто сослаться на errno — она определена таким образом, что всегда ссылается на корректное значение переменной для потока. Для дополнительной информации смотрите ThreadCreate().

В <errno.h> также определены следующие переменные:

sys_errlist
Массив сообщений об ошибках, ссылающихся на errno.
sys_nerr
Количество сообщений в массиве sys_errlist.

Значения errno включают минимум следующие значения:

Макрос Значение
E2BIG Список аргументов слишком длинный
EACCES Нет соответствующего разрешения
EADDRINUSE Адрес уже используется
EADDRNOTAVAIL Запрашиваемый адрес недоступен
EADV Ошибка объявления
EAFNOSUPPORT Семейство адресов не поддерживается семейством протокола
EAGAIN Ресурс временно недоступен; попытайтесь позднее
EALREADY Операция уже выполняется (смотрите “Изменения в EALREADY” ниже)
EBADE Некорректный обмен
EBADF Некорректный файловый дескриптор
EBADFD Для данной операции файловый дескриптор некорректен
EBADFSYS Обнаружена поврежденная файловая система
EBADMSG Некорректное сообщение (1003.1b-1993)
EBADR Некорректный запрашиваемый дескриптор
EBADRPC Структура RPC некорректна
EBADRQC Некорректный код запроса
EBADSLT Некорректный слот
EBFONT Некорректный формат шрифта
EBUSY Устройство или ресурс заняты
ECANCELED Операция отменена (1003.1b-1993)
ECHILD Отсутствуют дочерние процессы
ECHRNG Значение номера канала выходит за допустимый диапазон
ECOMM Ошибка соединения во время отправки
ECONNABORTED Программное обеспечение вызвало разрыв соединения
ECONNREFUSED В соединении отказано
ECONNRESET Подключение сброшено одноранговым узлом
ECTRLTERM Переназначение на управляющий терминал
EDEADLK Избежание блокировки ресурса
EDEADLOCK Взаимная блокировка файла
EDESTADDRREQ Требуется адрес назначения
EDOM Математический аргумент вне области определения функции
EDQUOT Превышено дисковая квота
EENDIAN Порядок байт не поддерживается
EEXIST Файл существует
EFAULT Некорректный адрес
EFPOS Ошибка установки позиции в файле
EFBIG Файл слишком большой
EHOSTDOWN Хост не работает
EHOSTUNREACH Невозможно связаться с удаленным узлом
EIDRM Идентификатор удален
EILSEQ Некорректная последовательность байт
EINPROGRESS Операция выполняется в данный момент
EINTR Вызов функции был прерван
EINVAL Некорректный аргумент
EIO Ошибка ввода/вывода
EISCONN Сокет уже соединен
EISDIR Ожидается директория
EL2HLT Level 2 halted
EL2NSYNC Level 2 not synchronized
EL3HLT Level 3 halted
EL3RST Level 3 reset
ELIBACC Нет доступа к разделяемой библиотеке
ELIBBAD Доступ к поврежденной разделяемой библиотеке
ELIBEXEC Попытка выполнения разделяемой библиотеки
ELIBMAX Попытка связывания со слишком многим количеством библиотек
ELIBSCN Секция .lib в a.out повреждена
ELNRNG Номер ссылки вне допустимого диапазона
ELOOP Слишком много уровней символических ссылок или префиксов
EMFILE Слишком много открытых файлов
EMLINK Слишком много ссылок
EMORE Отправьте сообщение снова
EMSGSIZE Несоответствующая длина буфера сообщения
EMULTIHOP Попытка множественного перехода
ENAMETOOLONG Имя файла слишком длинное
ENETDOWN Сеть не работает
ENETRESET Сеть сбросила соединение во время перезапуска
ENETUNREACH Сеть недоступна
ENFILE Слишком много открытых файлов в системе
ENOANO Нет индексного дескриптора
ENOBUFS В буфере отсутствует свободное пространство
ENOCSI Нет доступной структуры CSI
ENODATA Нет данных (для ввода/вывода без задержек)
ENODEV Устройство отсутствует
ENOENT Нет указанного файла или директории
ENOEXEC Ошибка формата исполняемого файла
ENOLCK Нет доступных блокировок
ENOLIC Лицензия недоступна
ENOLINK Ссылка была разорвана
ENOMEM Недостаточно памяти
ENOMSG Нет сообщения желаемого типа
ENONDP Для запуска нужен NDP (8087...)
ENONET Компьютер находится не в сети
ENOPKG Пакет не установлен
ENOPROTOOPT Протокол недоступен
ENOREMOTE Должно выполняться на локальном компьютере
ENOSPC На устройстве не осталось свободного места
ENOSR Нет потоковых ресурсов
ENOSTR Устройство не является потоковым
ENOSYS Функция не реализована
ENOTBLK Требуется блочное устройство
ENOTCONN Нет соединения с сокетом
ENOTDIR Не является директорией
ENOTEMPTY Директория не пуста
ENOTSOCK Операция сокета для сущности, не являющейся сокетом
ENOTSUP Не поддерживается (1003.1b-1993)
ENOTTY Несоответствующая операция управления вводом/выводом
ENOTUNIQ Указанное имя не является уникальным
ENXIO Нет указанного устройства или адреса
EOK Успешно
EOPNOTSUPP Операция не поддерживается
EOVERFLOW Значение слишком большое для размешения в типе данных
EOWNERDEAD Хозяин блокировки завершен во время ее удерживания
EPERM Нет разрешения на операцию
EPFNOSUPPORT Семейство протоколов не поддерживается
EPIPE Канал поврежден
EPROCUNAVAIL Некорректная функция программы
EPROGMISMATCH Некорректная версия программы
EPROGUNAVAIL Программа RPC недоступна
EPROTO Ошибка протокола
EPROTONOSUPPORT Протокол не поддерживается
EPROTOTYPE Протокол имеет некорректный тип для сокета
ERANGE Результат слишком большой
EREMCHG Удаленный адрес изменился
EREMOTE Объект является удаленным
ERESTART Системный вызов должен быть перезапущен
EROFS Файловая система доступна только для чтения
ERPCMISMATCH Некорректная версия RPC
ESHUTDOWN Отправка после закрытия сокета невозможна
ESOCKTNOSUPPORT Тип сокета не поддерживается
ESPIPE Недопустимый поиск
ESRCH Процесс отсутствует
ESRMNT Ошибка монтирования сервера
ESRVRFAULT Получатель сообщения обнаружил ошибку памяти при доступе к буферу получения/отправки.
ESTALE Потенциально исправимая ошибка ввода/вывода
ESTRPIPE Для канала/FIFO - ошибка потокового канала
ETIME Таймер истек
ETIMEDOUT Таймаут соединения
ETOOMANYREFS Слишком много ссылок
ETXTBSY Текстовый файл занят
EUNATCH Драйвер протокола не присоединен
EUSERS Слишком много пользователей (для UFS)
EWOULDBLOCK Операция будет заблокирована
EXDEV Ссылка между устройствами
EXFULL Exchange full

Изменения в EALREADY

POSIX требует, чтобы номера ошибок в <errno.h> имели уникальное значение. Для удовлетворения этого требования EALREADY изменен и не имеет одинакового значения с EBUSY.

Это изменение могло вызвать проблемы совместимости, поскольку код, использующий в данный момент EALREADY, был скомпилирован со старым значением. Для безопасного перехода к новому значению заголовочный файл <errno.h> был изменен путем определения новых символьных значений:

EALREADY_OLD
Старое значение (16).
EALREADY_NEW
Новое значение (237).
EALREADY_DYNAMIC
Значение, которое можно сконфигурировать во время запуска. Это переменная в libc, которая устанавливается в старое или новое значение на основе общесистемного параметра конфигурации.

В следующей редакции значение EALREADY будет изменено на EALREADY_NEW. Чтобы обеспечить безопасный переход к новому значению, нужно модифицировать код следующим образом:

Можно использовать опцию -e procnto-* для установки значения EALREADY_DYNAMIC:

Примеры:

/*
* The following program makes an illegal call
* to the write() function, then prints the
* value held in errno.
*/
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int main( void )
{
int errvalue;
errno = EOK;
write( -1, "hello, world\n", strlen( "hello, world\n" ) );
errvalue = errno;
printf( "The error generated was %d\n", errvalue );
printf( "That means: %s\n", strerror( errvalue ) );
}

Классификация:

ANSI, POSIX 1003.1

Тематические ссылки:

h_errno, perror(), stderr, strerror(), strerror_r()




Предыдущий раздел: Описание API системной библиотеки