ERRNO(3) Руководство программиста Linux ERRNO(3) ИМЯ errno - код последней ошибки ОБЗОР #include <errno.h> ОПИСАНИЕ В заголовочном файле <errno.h> определяется целочисленная переменная errno, которая используется системными вызовами и некоторыми библиотечными функциями при ошибках для указания того, что именно произошло. Её значение имеет смысл только тогда, когда вызов возвратил ошибку (т.е., -1 для большинства системных вызовов или NULL — для большинства библиотечных функций); при успешном выполнении функции также могут менять значение errno. Допускаемые номера ошибок не равны нулю; значение errno никогда не устанавливается в ноль какими-либо системными вызовами или библиотечными функциями. Некоторые системные вызовы или библиотечные функции (например, getpriority(2)), при успешном выполнении возвращают -1. В этих случаях успешность выполнения можно отличить от ошибки присвоив errno значение нуля перед вызовом, и затем, если вызов вернул состояние, которое может указывать на ошибку, проверить, равно ли errno ненулевому значению. Переменная errno определена в стандарте ISO C как изменяемое lvalue int и не объявляемая явно; errno может быть и макросом. Переменная errno является локальным значением нити; её изменение в одной нити не влияет на её значение в другой нити. Всем названиям ошибок, определённым в POSIX.1, должны соответствовать разные значения, за исключением EAGAIN и EWOULDBLOCK, которые могут быть одинаковыми. Далее приведён список символических имён ошибок, определённых в Linux. Некоторые из них, отмеченные как POSIX.1, определены в POSIX.1-2001, а отмеченные как C99 — определены в C99. E2BIG Слишком длинный список параметров (POSIX.1) EACCES Доступ запрещён (POSIX.1) EADDRINUSE Адрес уже используется (POSIX.1) EADDRNOTAVAIL Адрес недоступен (POSIX.1) EAFNOSUPPORT Семейство адресов не поддерживается (POSIX.1) EAGAIN Ресурс временно недоступен (значение может быть равным EWOULDBLOCK) (POSIX.1) EALREADY Соединение уже выполняется (POSIX.1) EBADE Некорректный обмен EBADF Неправильный дескриптор файла (POSIX.1) EBADFD Некорректное состояние дескриптора файла EBADMSG Неправильное сообщение (POSIX.1) EBADR Неверный дескриптор запроса EBADRQC Неверный код запроса EBADSLT Некорректный слот EBUSY Устройство или ресурс занято (POSIX.1) ECANCELED Операция отменена (POSIX.1) ECHILD Отсутствуют дочерние процессы (POSIX.1) ECHRNG Номер канала вне диапазона ECOMM Ошибка связи при отправке ECONNABORTED Соединение было прервано (POSIX.1) ECONNREFUSED В соединении отказано (POSIX.1) ECONNRESET Соединение сброшено другой стороной (POSIX.1) EDEADLK Предотвращена тупиковая ситуация при обращении к ресурсу (POSIX.1) EDEADLOCK Синоним EDEADLK EDESTADDRREQ Требуется указать адрес назначения (POSIX.1) EDOM Математический аргумент вне области определения функции (POSIX.1, C99) EDQUOT Превышена дисковая квота (POSIX.1) EEXIST Файл существует (POSIX.1) EFAULT Неправильный адрес (POSIX.1) EFBIG Файл слишком велик (POSIX.1) EHOSTDOWN Узел выключен EHOSTUNREACH Узел недоступен (POSIX.1) EIDRM Идентификатор удалён (POSIX.1) EILSEQ Недопустимая последовательность байт (POSIX.1, C99) EINPROGRESS Операция выполняется (POSIX.1) EINTR Прерванный вызов функции (POSIX.1); смотрите signal(7). EINVAL Неверный аргумент (POSIX.1) EIO Ошибка ввода/вывода (POSIX.1) EISCONN Сокет подключён (POSIX.1) EISDIR Это каталог (POSIX.1) EISNAM Является файлом именованного типа EKEYEXPIRED Ключ с истёкшим сроком EKEYREJECTED Ключ был отвергнут службой EKEYREVOKED Ключ был отозван EL2HLT Уровень 2 остановлен EL2NSYNC Уровень 2 не синхронизирован EL3HLT Уровень 3 остановлен EL3RST Уровень 3 остановлен ELIBACC Невозможно получить доступ к нужной общей библиотеке ELIBBAD Обращение к повреждённой общей библиотеке ELIBMAX Попытка компоновки с слишком большим количеством общих библиотек ELIBSCN Секция lib в a.out повреждена ELIBEXEC Невозможно непосредственно выполнить общую библиотеку ELOOP Слишком много уровней символьных ссылок (POSIX.1) EMEDIUMTYPE Неправильный тип носителя EMFILE Слишком много открытых файлов (POSIX.1); обычно, это из-за превышения ограничения ресурса RLIMIT_NOFILE, описанного в getrlimit(2) EMLINK Слишком много ссылок (POSIX.1) EMSGSIZE Сообщение слишком длинное (POSIX.1) EMULTIHOP Попытка Multihop (POSIX.1) ENAMETOOLONG Название файла слишком длинное (POSIX.1) ENETDOWN Сеть не работает (POSIX.1) ENETRESET Соединение прервано из-за сети (POSIX.1) ENETUNREACH Сеть недоступна (POSIX.1) ENFILE Слишком много открытых файлов в системе (POSIX.1); в Linux это, вероятно результат достижения ограничения /proc/sys/fs/file-max (смотрите proc(5)). ENOBUFS Недостаточно буферного пространства (POSIX.1 (часть XSI STREAMS)) ENODATA Сообщение в голове очереди чтения STREAM отсутствует (POSIX.1) ENODEV Нет такого устройства (POSIX.1) ENOENT Нет такого файла или каталога (POSIX.1) Обычно, эта ошибка является результатом указания несуществующего пути или отсутствия одного из компонентов каталогов пути, или указанный путь является символической ссылкой на несуществующий объект. ENOEXEC Ошибка формата выполняемого файла (POSIX.1) ENOKEY Требуемый ключ недоступен ENOLCK Нет доступных блокировок (POSIX.1) ENOLINK Соединение было разорвано (POSIX.1) ENOMEDIUM Носитель не найден ENOMEM Недостаточно места (POSIX.1) ENOMSG Нет сообщения желаемого типа (POSIX.1) ENONET Машина не в сети ENOPKG Пакет не установлен ENOPROTOOPT Протокол недоступен (POSIX.1) ENOSPC На устройстве не осталось места (POSIX.1) ENOSR Отсутствую ресурсы STREAM (POSIX.1 (часть XSI STREAMS)) ENOSTR Нет STREAM (POSIX.1 (часть XSI STREAMS)) ENOSYS Функция не реализована (POSIX.1) ENOTBLK Требуется блочное устройство ENOTCONN Сокет не подключён (POSIX.1) ENOTDIR Не каталог (POSIX.1) ENOTEMPTY Каталог не пуст (POSIX.1) ENOTSOCK Не сокет (POSIX.1) ENOTSUP Неподдерживаемая операция (POSIX.1) ENOTTY Неподходящая операция управления вводом/выводом (POSIX.1) ENOTUNIQ Имя не уникально в сети ENXIO Нет такого устройства или адреса (POSIX.1) EOPNOTSUPP Операция не поддерживается на сокете (POSIX.1) (ENOTSUP и EOPNOTSUPP в Linux имеют одинаковые значения, но согласно POSIX.1 значения этих ошибок должны различаться.) EOVERFLOW Значение слишком велико для хранения в таком типе данных (POSIX.1) EPERM Операция не позволена (POSIX.1) EPFNOSUPPORT Неподдерживаемое семейство протоколов EPIPE Обрыв канала (POSIX.1) EPROTO Ошибка протокола (POSIX.1) EPROTONOSUPPORT Протокол не поддерживается (POSIX.1) EPROTOTYPE Неподдерживаемый тип протокола для сокета (POSIX.1) ERANGE Результат слишком большой (POSIX.1, C99) EREMCHG Удалённый адрес был изменён EREMOTE Это удалённый объект EREMOTEIO Ошибка удалённого ввода/вывода ERESTART Прерванный системный вызов следует перезапустить EROFS Файловая система, доступная только для чтения (POSIX.1) ESHUTDOWN Невозможно отправить данные после выключения конечной точки передачи ESPIPE Недопустимое перемещение (POSIX.1) ESOCKTNOSUPPORT Неподдерживаемый тип сокета ESRCH Нет такого процесса (POSIX.1) ESTALE Неактуальный дескриптор файла (POSIX.1) Эта ошибка может возникать в NFS и других файловых системах ESTRPIPE Ошибка потоков канала ETIME Таймер истёк (POSIX.1 (часть XSI STREAMS)) (в POSIX.1 описывается как «в ioctl(2) истекло время ожидания STREAM») ETIMEDOUT Время ожидания соединения истекло (POSIX.1) ETXTBSY Текстовый файл занят (POSIX.1) EUCLEAN Структуру необходимо почистить EUNATCH Драйвер протокола не подсоединён EUSERS Слишком много пользователей EWOULDBLOCK Операция приведёт к блокировке (значение может быть равным EAGAIN) (POSIX.1) EXDEV Некорректная ссылка (POSIX.1) EXFULL Обмен полон ЗАМЕЧАНИЯ Распространённая ошибка: if (somecall() == -1) { printf("somecall() failed\n"); if (errno == ...) { ... } } Здесь errno может больше не иметь значение результата последнего вызова somecall() (т.е., значение может измениться из-за printf(3)). Если значение errno важно, то его нужно сохранять между библиотечными вызовами: if (somecall() == -1) { int errsv = errno; printf("somecall() failed\n"); if (errsv == ...) { ... } } Раньше в Си было распространена практика определения errno вручную (т.е., extern int errno), вместо включения файла <errno.h>. Не делайте этого. Это не будет работать с современными версиями библиотеки Си. Однако, на (очень) старых системах UNIX файл <errno.h> может отсутствовать и определение необходимо. СМОТРИТЕ ТАКЖЕ errno(1), err(3), error(3), perror(3), strerror(3) 2016-03-15 ERRNO(3)