errno(3)

ИМЯ
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 <azamat.hackimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 (https://www.gnu.org/licenses/gpl-3.0.html) или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.