Provided by: manpages-ru-dev_4.19.0-7_all
ИМЯ
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⟩.