ИМЯ

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

LIBRARY

Standard C library ( libc, -lc)

СИНТАКСИС

#include <errno.h>

ОПИСАНИЕ

В заголовочном файле <errno.h> определяется целочисленная переменная errno, которая используется системными вызовами и некоторыми библиотечными функциями при ошибках для указания того, что именно произошло.

errno

Значение errno имеет смысл только тогда, когда вызов возвратил ошибку (а именно: -1 — для большинства системных вызовов; NULL — для большинства библиотечных функций); при успешном выполнении функции также могут менять значение errno. Системные вызовы и библиотечные функции никогда не присваивают errno значение нуля.
Некоторые системные вызовы или библиотечные функции (например, getpriority(2)), при успешном выполнении возвращают -1. В этих случаях успешность выполнения можно отличить от ошибки присвоив errno значение нуля перед вызовом, и затем, если вызов вернул состояние, которое может указывать на ошибку, проверить, равно ли errno ненулевому значению.
Переменная errno определена в стандарте ISO C как изменяемое lvalue int и не объявляемая явно; errno может быть и макросом. Переменная errno является локальным значением нити; её изменение в одной нити не влияет на её значение в другой нити.

Номера и имена ошибок

Все положительные числа считаются допустимыми номерами ошибок. В заголовочном файле <errno.h> определены символические имена для каждого номера возможной ошибки, который может появиться в errno.
Всем названиям ошибок, определённым в POSIX.1, должны соответствовать разные значения, за исключением EAGAIN и EWOULDBLOCK, которые могут быть одинаковыми. В Linux эти они имеют одинаковое значение на всех архитектурах.
В разных системах UNIX символическим именам ошибок назначены разные номера, и это верно даже в Linux для разных архитектур. Поэтому числовые значение не указаны в представленном далее списке имён ошибок. Для преобразования этих имён в текстовые сообщения об ошибках можно использовать функции perror(3) и strerror(3).
В любой системе Linux можно получить список всех символических имён ошибок и соответствующие им номера с помощью команды errno(1)) (является частью пакета moreutils):

$  errno -l
EPERM 1 Операция не позволена
ENOENT 2 Нет такого файла или каталога
ESRCH 3 Нет такого процесса
EINTR 4 Прерван системный вызов
EIO 5 Ошибка ввода/вывода
...

Команду errno(1) также можно использовать для поиска ошибок по имени или номеру, а также по строке, входящей в описание ошибки:

$  errno 2
ENOENT 2 Нет такого файла или каталога
$  errno ESRCH
ESRCH 3 Нет такого процесса
$  errno -s permission
EACCES 13 Отказано в доступе

Список имён ошибок

В представленном далее списки символических имён ошибок у некоторых есть некоторые примечания:
POSIX.1-2001
The name is defined by POSIX.1-2001, and is defined in later POSIX.1 versions, unless otherwise indicated.
POSIX.1-2008
The name is defined in POSIX.1-2008, but was not present in earlier POSIX.1 standards.
C99
The name is defined by C99.
Below is a list of the symbolic error names that are defined on Linux:
E2BIG
Слишком длинный список параметров (POSIX.1-2001).
EACCES
Доступ запрещён (POSIX.1-2001).
EADDRINUSE
Адрес уже используется (POSIX.1-2001).
EADDRNOTAVAIL
Адрес недоступен (POSIX.1-2001).
EAFNOSUPPORT
Семейство адресов не поддерживается (POSIX.1-2001).
EAGAIN
Ресурс временно недоступен (значение может быть равным EWOULDBLOCK) (POSIX.1-2001).
EALREADY
Соединение уже выполняется (POSIX.1-2001).
EBADE
Некорректный обмен.
EBADF
Неправильный дескриптор файла (POSIX.1-2001).
EBADFD
Некорректное состояние дескриптора файла.
EBADMSG
Неправильное сообщение (POSIX.1-2001).
EBADR
Неверный дескриптор запроса.
EBADRQC
Неверный код запроса.
EBADSLT
Некорректный слот.
EBUSY
Устройство или ресурс заняты (POSIX.1-2001).
ECANCELED
Операция отменена (POSIX.1-2001).
ECHILD
Отсутствуют дочерние процессы (POSIX.1-2001).
ECHRNG
Номер канала вне диапазона.
ECOMM
Ошибка связи при отправке.
ECONNABORTED
Соединение было прервано (POSIX.1-2001).
ECONNREFUSED
В соединении отказано (POSIX.1-2001).
ECONNRESET
Соединение сброшено другой стороной (POSIX.1-2001).
EDEADLK
Предотвращена тупиковая ситуация при обращении к ресурсу (POSIX.1-2001).
EDEADLOCK
На большинстве архитектур является синонимом EDEADLK. На некоторых архитектурах (например, Linux MIPS, PowerPC, SPARC), это отдельный код ошибки «Ошибка перекрёстной блокировки файла».
EDESTADDRREQ
Требуется указать адрес назначения (POSIX.1-2001).
EDOM
Математический аргумент вне области определения функции (POSIX.1, C99).
EDQUOT
Превышена дисковая квота (POSIX.1-2001).
EEXIST
Файл существует (POSIX.1-2001).
EFAULT
Неправильный адрес (POSIX.1-2001).
EFBIG
Файл слишком велик (POSIX.1-2001).
EHOSTDOWN
Узел выключен.
EHOSTUNREACH
Узел недоступен (POSIX.1-2001).
EHWPOISON
В странице памяти аппаратная ошибка.
EIDRM
Идентификатор удалён (POSIX.1-2001).
EILSEQ
Неверный или неполный мультибайтный или широкий символ (POSIX.1, C99).
Этот текст взят из описания ошибки glibc; в POSIX.1 эта ошибка звучит как «Недопустимая последовательность байт».
EINPROGRESS
Операция выполняется (POSIX.1-2001).
EINTR
Прерванный вызов функции (POSIX.1-2001); смотрите signal(7).
EINVAL
Неверный аргумент (POSIX.1-2001).
EIO
Ошибка ввода/вывода (POSIX.1-2001).
EISCONN
Сокет подключён (POSIX.1-2001).
EISDIR
Это каталог (POSIX.1-2001).
EISNAM
Является файлом именованного типа.
EKEYEXPIRED
Ключ с истёкшим сроком.
EKEYREJECTED
Ключ был отвергнут службой.
EKEYREVOKED
Ключ был отозван.
EL2HLT
Уровень 2 остановлен.
EL2NSYNC
Уровень 2 не синхронизирован.
EL3HLT
Уровень 3 остановлен.
EL3RST
Уровень 3 сброшен.
ELIBACC
Невозможно получить доступ к нужной общей библиотеке.
ELIBBAD
Обращение к повреждённой общей библиотеке.
ELIBMAX
Попытка компоновки с слишком большим количеством общих библиотек.
ELIBSCN
Секция .lib в a.out повреждена
ELIBEXEC
Невозможно непосредственно выполнить общую библиотеку.
ELNRNG
Число ссылок вне допустимого диапазона.
ELOOP
Слишком много уровней символьных ссылок (POSIX.1-2001).
EMEDIUMTYPE
Неправильный тип носителя.
EMFILE
Too many open files (POSIX.1-2001). Commonly caused by exceeding the RLIMIT_NOFILE resource limit described in getrlimit(2). Can also be caused by exceeding the limit specified in /proc/sys/fs/nr_open.
EMLINK
Слишком много ссылок (POSIX.1-2001).
EMSGSIZE
Сообщение слишком длинное (POSIX.1-2001).
EMULTIHOP
Попытка Multihop (POSIX.1-2001).
ENAMETOOLONG
Слишком длинное название файла (POSIX.1-2001).
ENETDOWN
Сеть не работает (POSIX.1-2001).
ENETRESET
Соединение прервано из-за сети (POSIX.1-2001).
ENETUNREACH
Сеть недоступна (POSIX.1-2001).
ENFILE
Слишком много открытых файлов в системе (POSIX.1-2001). В Linux это, вероятно, результат достижения ограничения /proc/sys/fs/file-max (смотрите proc(5)).
ENOANO
Не anode.
ENOBUFS
Недостаточно буферного пространства (POSIX.1 (часть XSI STREAMS)).
ENODATA
The named attribute does not exist, or the process has no access to this attribute; see xattr(7).
In POSIX.1-2001 (XSI STREAMS option), this error was described as "No message is available on the STREAM head read queue".
ENODEV
Нет такого устройства (POSIX.1-2001).
ENOENT
Нет такого файла или каталога (POSIX.1-2001).
Обычно, эта ошибка является результатом указания несуществующего пути или отсутствия одного из компонентов каталогов пути, или указанный путь является символической ссылкой на несуществующий объект.
ENOEXEC
Ошибка формата выполняемого файла (POSIX.1-2001).
ENOKEY
Требуемый ключ недоступен.
ENOLCK
Нет доступных блокировок (POSIX.1-2001).
ENOLINK
Соединение было разорвано (POSIX.1-2001).
ENOMEDIUM
Носитель не найден.
ENOMEM
Недостаточно места/невозможно выделить память (POSIX.1-2001).
ENOMSG
Нет сообщения желаемого типа (POSIX.1-2001).
ENONET
Машина не в сети.
ENOPKG
Пакет не установлен.
ENOPROTOOPT
Протокол недоступен (POSIX.1-2001).
ENOSPC
На устройстве не осталось места (POSIX.1-2001).
ENOSR
Отсутствую ресурсы STREAM (POSIX.1 (часть XSI STREAMS)).
ENOSTR
Нет STREAM (POSIX.1 (часть XSI STREAMS)).
ENOSYS
Функция не реализована (POSIX.1-2001).
ENOTBLK
Требуется блочное устройство.
ENOTCONN
Сокет не подключён (POSIX.1-2001).
ENOTDIR
Не каталог (POSIX.1-2001).
ENOTEMPTY
Каталог не пуст (POSIX.1-2001).
ENOTRECOVERABLE
Состояние нельзя восстановить (POSIX.1-2008).
ENOTSOCK
Не сокет (POSIX.1-2001).
ENOTSUP
Операция не поддерживается (POSIX.1-2001).
ENOTTY
Неподходящая операция управления вводом/выводом (POSIX.1-2001).
ENOTUNIQ
Имя не уникально в сети.
ENXIO
Нет такого устройства или адреса (POSIX.1-2001).
EOPNOTSUPP
Операция не поддерживается на сокете (POSIX.1-2001).
(ENOTSUP и EOPNOTSUPP в Linux имеют одинаковые значения, но согласно POSIX.1 значения этих ошибок должны различаться.)
EOVERFLOW
Значение слишком велико для хранения в таком типе данных (POSIX.1-2001).
EOWNERDEAD
Владелец умер (POSIX.1-2008).
EPERM
Операция не позволена (POSIX.1-2001).
EPFNOSUPPORT
Семейство протоколов не поддерживается.
EPIPE
Обрыв канала (POSIX.1-2001).
EPROTO
Ошибка протокола (POSIX.1-2001).
EPROTONOSUPPORT
Протокол не поддерживается (POSIX.1-2001).
EPROTOTYPE
Неверный тип протокола для сокета (POSIX.1-2001).
ERANGE
Результат слишком большой (POSIX.1, C99).
EREMCHG
Удалённый адрес был изменён.
EREMOTE
Это удалённый объект.
EREMOTEIO
Ошибка удалённого ввода/вывода.
ERESTART
Прерванный системный вызов следует перезапустить.
ERFKILL
Операция не позволяется из-за RF-kill.
EROFS
Файловая система доступна только для чтения (POSIX.1-2001).
ESHUTDOWN
Невозможно отправить данные после выключения конечной точки передачи.
ESPIPE
Недопустимое перемещение (POSIX.1-2001).
ESOCKTNOSUPPORT
Тип сокета не поддерживается.
ESRCH
Нет такого процесса (POSIX.1-2001).
ESTALE
Неактуальный дескриптор файла (POSIX.1-2001).
Эта ошибка может возникать в NFS и других файловых системах.
ESTRPIPE
Ошибка потоков канала.
ETIME
Таймер истёк (POSIX.1 (часть XSI STREAMS)).
(в POSIX.1 описывается как «в ioctl(2) истекло время ожидания STREAM»)
ETIMEDOUT
Время ожидания соединения истекло (POSIX.1-2001).
ETOOMANYREFS
Слишком много ссылок: невозможно объединить.
ETXTBSY
Текстовый файл занят (POSIX.1-2001).
EUCLEAN
Структуру необходимо очистить.
EUNATCH
Драйвер протокола не подсоединён.
EUSERS
Слишком много пользователей.
EWOULDBLOCK
Операция приведёт к блокировке (значение может быть равно EAGAIN) (POSIX.1-2001).
EXDEV
Invalid cross-device link (POSIX.1-2001).
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 == ...) { ... }
}

Note that the POSIX threads APIs do not set errno on error. Instead, on failure they return an error number as the function result. These error numbers have the same meanings as the error numbers returned in errno by other APIs.
В некоторых древних системах файл <errno.h> отсутствовал или не объявлял errno, поэтому это нужно было делать вручную (например, extern int errno). Не делайте этого. Это давно уже не нужно, и вызовет проблемы с современными версиями библиотеки C.

СМ. ТАКЖЕ

errno(1), err(3), error(3), perror(3), strerror(3)

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Azamat Hackimov <[email protected]>, Yuri Kozlov <[email protected]> и Иван Павлов <[email protected]>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]