Linux Man на русском

  User    Syst    Libr    Device    Files    Other    Admin  



   errno - код последней ошибки

errno(3) код последней ошибки


ОБЗОР

#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> может отсутствовать и определение необходимо.