errno.h
Стандартная библиотека C (libc) |
---|
Общие темы |
Разные заголовки |
|
errno.h — заголовочный файл стандартной библиотеки языка программирования C. Он определяет макросы для сообщения и получения ошибок с помощью символа errno
(сокращение от «номер ошибки»). [1]
errno
действует как целочисленная переменная. Значение (номер ошибки) сохраняется в errno
определенными библиотечными функциями при обнаружении ошибок. При запуске программы сохраненное значение равно нулю. Библиотечные функции хранят только значения больше нуля. Любая библиотечная функция может изменить значение, сохраненное перед возвратом, независимо от того, обнаруживают ли они ошибки. [2] Большинство функций сообщают, что они обнаружили ошибку, возвращая специальное значение, обычно NULL для функций, возвращающих указатели , и -1 для функций, возвращающих целые числа. Некоторые функции требуют от вызывающего абонента предварительной настройки. errno
обнулить, а затем проверить его, чтобы увидеть, была ли обнаружена ошибка.
The errno
макрос расширяется до lvalue с типом int
, иногда с extern
и/или volatile
спецификаторы типа в зависимости от платформы. [3] Первоначально это была статическая ячейка памяти, но сегодня макросы почти всегда используются для обеспечения многопоточности , чтобы каждый поток видел свой собственный , локальный для потока номер ошибки .
Файл заголовка также определяет макросы, которые расширяются до целочисленных констант, представляющих коды ошибок. Стандартная библиотека C требует определения только трёх: [2]
ЭДОМ
- Результаты параметра вне домена функции, например
sqrt(-1)
ЭРАНЖ
- Результаты результата вне диапазона функции, например
strtol("0xfffffffff", NULL, 0)
в системах с 32-битной ширинойlong
EILSEQ (требуется с поправки 1 1994 г. к стандарту C89) [4]
- Результат неправильной последовательности байтов, например
mbstowcs(buf, "\xff", 1)
в системах, использующих UTF-8 .
POSIX- совместимые операционные системы, такие как AIX , Linux или Solaris , включают множество других значений ошибок, многие из которых используются гораздо чаще, чем приведенные выше, например EACCES , когда файл не может быть открыт для чтения. [5] C++11 дополнительно определяет многие из тех же значений, что и в спецификации POSIX. [6]
Традиционно на первой странице системных руководств Unix это не так , называемой intro(2), перечислены все макросы errno.h, но в Linux , где эти макросы вместо этого перечислены в errno(3). [7]
Ан errno
может быть преобразовано в описательную строку с помощью strerror (определенного в string.h ) или расширения BSD, называемого sys_errlist
. Перевод можно вывести непосредственно в стандартный поток ошибок, используя perror (определенный в stdio.h ). Как strerror
во многих Unix-подобных системах не является потокобезопасной версией, а является потокобезопасной версией. strerror_r
используется, но противоречивые определения POSIX и GNU делают его еще менее переносимым, чем sys_errlist
стол. [8]
Макросы GLIBC
[ редактировать ]Библиотека GNU C (GLIBC) предоставляет дополнительные макросы значений ошибок POSIX в заголовочном файле. errno.h
. [9] Это описания макросов, предоставленные strerror , за исключением 41 и 58, поскольку они не входят в стандарт POSIX :
ЭПЕРМ (1)
- Операция не разрешена
ЭНОЕНТ (2)
- Данный файл или каталог отсутствует
ЭСРЧ (3)
- Нет такого процесса
ЭНТР (4)
- Прерванный системный вызов
ЭИО (5)
- Ошибка ввода/вывода
ЭНСИО (6)
- Нет такого устройства или адреса
Э2БОЛЬШОЙ (7)
- Список аргументов слишком длинный
ЭНОЭКСЕК (8)
- Ошибка формата Exec
ЭБАДФ (9)
- Неверный файловый дескриптор
ЭЧИЛЬД (10)
- Нет дочерних процессов
ИГАН (11)
- Ресурс временно недоступен
ЭНОМЕМ (12)
- Невозможно выделить память
ЕАКСЕС (13)
- Доступ запрещен
ЭФАУЛЬТ (14)
- Неверный адрес
ЭНОТБЛК (15)
- Требуется блокирующее устройство
ЗАНЯТО (16)
- Устройство или ресурс заняты
СУЩЕСТВУЕТ (17)
- Файл существует
ЭКДЕВ (18)
- Неверная ссылка на несколько устройств.
ЭНОДЕВ (19)
- Нет такого устройства
ЭНОТИР (20)
- Не каталог
ЭИСДИР (21)
- Это каталог
ОДИН ВЫБОР (22)
- Неверный аргумент
НАДЕТЬ (23)
- Слишком много открытых файлов в системе
ЭМФИЛЬ (24)
- Слишком много открытых файлов
ЭНОТТИ (25)
- Неподходящий ioctl для устройства
ЭКТТБСИ (26)
- Текстовый файл занят
ЭФБИГ (27)
- Файл слишком большой
ЭНОСПЦ (28)
- На устройстве не осталось места
ЭСПАЙП (29)
- Незаконный поиск
ЭРОФС (30)
- Файловая система только для чтения
ЭМЛИНК (31)
- Слишком много ссылок
ЭПИПЕ (32)
- Сломанная труба
ЭДОМ (33)
- Числовой аргумент вне области определения
ЭРАНЖ (34)
- Числовой результат вне диапазона
ЭДЕАДЛК (35)
- Блокировка ресурсов предотвращена
ЭНАМЕТУЛОНГ (36)
- Имя файла слишком длинное
ЭНОЛК (37)
- Нет доступных замков
ЭНОСИС (38)
- Функция не реализована
ЭНОТЕМПТИЯ (39)
- Каталог не пустой
ЭЛУП (40)
- Слишком много уровней символических ссылок
ЭНОМСГ (42)
- Нет сообщения нужного типа
ЕИДРМ (43)
- Идентификатор удален.
ЕСПЧНГ (44)
- Номер канала вне диапазона
ЭЛ2НСИНК (45)
- Уровень 2 не синхронизирован
ЭЛ3ХЛТ (46)
- Уровень 3 остановлен
ЭЛ3РСТ (47)
- Сброс уровня 3
ЭЛНРНГ (48)
- Номер ссылки вне диапазона
Юнатч (49)
- Драйвер протокола не подключен
ЭНОЦИ (50)
- Структура CSI недоступна
ЭЛ2ХЛТ (51)
- Уровень 2 остановлен
ЭБАДЕ (52)
- Неверный обмен
ЭБАДР (53)
- Неверный дескриптор запроса
ИСПОЛНЕННЫЙ (54)
- Обмен полный
ЭНОАНО (55)
- Нет анода
ЭБАДРКК (56)
- Неверный код запроса
ЭБАДСЛТ (57)
- Неверный слот
ЭБФОНТ (59)
- Неправильный формат файла шрифта
ОДИНОЧНЫЙ (60)
- Устройство не поток
ЭНОДАТА (61)
- Нет доступных данных
ЭТАЙМ (62)
- Таймер истек
ЭНОСР (63)
- Недостаточно ресурсов потоков
ЭНОНЕТ (64)
- Машина не в сети
ЕНОПКГ (65)
- Пакет не установлен
ЭРЕМОТ (66)
- Объект удален
ЭНОЛИНК (67)
- Ссылка была разорвана
ЕАДВ (68)
- Ошибка рекламы
ЕСРМНТ (69)
- Ошибка монтирования
ЭКОММ (70)
- Ошибка связи при отправке
ЭПРОТО (71)
- Ошибка протокола
ЭМУЛЬТИХОП (72)
- Попытка многопереходного перехода
ЭДОТДОТ (73)
- Конкретная ошибка RFS
ЕБАДМСГ (74)
- Плохое сообщение
ЭОПЕРЕПОЛНЕНИЕ (75)
- Значение слишком велико для определенного типа данных.
ЭНОТУНИК (76)
- Имя не уникально в сети
ЕБАДФД (77)
- Дескриптор файла в плохом состоянии
ЭРЕМЧГ (78)
- Удаленный адрес изменен
ЭЛИБАКК (79)
- Невозможно получить доступ к необходимой общей библиотеке.
ЭЛИББАД (80)
- Доступ к поврежденной общей библиотеке
ЭЛИБСКН (81)
- Раздел .lib в a.out поврежден
ЭЛИБМАКС (82)
- Попытка связать слишком много общих библиотек
ЭЛИБЕКЕК (83)
- Невозможно запустить общую библиотеку напрямую
ЭИЛСЕК (84)
- Неверный или неполный многобайтовый или широкий символ.
ЭРЕСТАРТ (85)
- Прерванный системный вызов следует перезапустить.
ЭСТРПАЙП (86)
- Ошибка потока потоков
ЭУЗЕРЫ (87)
- Слишком много пользователей
ЭНОТСОК (88)
- Работа сокета без сокета
ЭДЕСТАДДРРЕК (89)
- Требуется адрес назначения
РАЗМЕР ЭМСГ (90)
- Сообщение слишком длинное
ЭПРОТОТИП (91)
- Неправильный тип протокола для сокета
ЭНОПРОТООПТ (92)
- Протокол недоступен
ЭПРОТОНОПОДДЕРЖКА (93)
- Протокол не поддерживается
ЭСОКТНООПОРТА (94)
- Тип сокета не поддерживается
ЭОПНОЦУПП (95)
- Операция не поддерживается
ЭПФНОСУППОРТ (96)
- Семейство протоколов не поддерживается
ЭАФНОПОДДЕРЖКА (97)
- Семейство адресов не поддерживается протоколом
ЭАДДРИНУСЕ (98)
- Адрес уже используется
ЭАДДРНОТАВЕЙЛ (99)
- Невозможно назначить запрошенный адрес
ЭНЕТДАУН (100)
- Сеть не работает
ЭНЕТУНРИЧ (101)
- Сеть недоступна
ЭНЕТРЕСЕТ (102)
- Сеть разорвала соединение при сбросе
ЭКОНАБОРТЫ (103)
- Программное обеспечение вызвало разрыв соединения
ЭКОННЕРЕСЕТ (104)
- Сброс соединения партнером
ЭНОБУФС (105)
- Нет свободного места в буфере
МОРОЖЕНОЕ (106)
- Конечная точка транспорта уже подключена
ЭНОТКОНН (107)
- Конечная точка транспорта не подключена
ЭШУТДАУН (108)
- Невозможно отправить после завершения работы конечной точки транспорта
ЭТООМАНИРЕФС (109)
- Слишком много ссылок: невозможно склеить
ЭТИМЕДАУТ (110)
- Время подключения истекло
ЭКОННРЕФУС (111)
- В соединении отказано
ЭХОСТДАУН (112)
- Хост не работает
ЭХОСТАНРИЧ (113)
- Нет маршрута к хосту
УЖЕ (114)
- Операция уже идет
ОКОНЧАТЕЛЬНЫЙ ПРОГРЕСС (115)
- Сейчас идет операция
НАЖМИТЕ (116)
- Устаревший дескриптор файла
ЕВКЛИН (117)
- Конструкция нуждается в чистке
ОДИНОЧНЫЙ (118)
- Не файл именованного типа XENIX.
ЭНАВАЙЛ (119)
- Семафоры XENIX недоступны.
ЭИСНАМ (120)
- Это файл именованного типа
ЭРЕМОТЕИО (121)
- Ошибка удаленного ввода-вывода
ЭДКО (122)
- Дисковая квота превышена
ЭНОМЕДИУМ (123)
- Носитель не найден
ЭМЕДИУМТИП (124)
- Неправильный тип носителя
ОТМЕНЕНО (125)
- Операция отменена
ЭНОКЕЙ (126)
- Требуемый ключ недоступен
EKEYистёк срок действия (127)
- Срок действия ключа истек
ЭКЕЙОТВОКЕД (128)
- Ключ был отозван
ЭКИОТКЛОНЕНО (129)
- Ключ отклонен сервисом
ЭВЛАНЕДРЕД (130)
- Владелец умер
ЭНОВОССТАНАВЛИВАЕМЫЕ (131)
- Состояние не подлежит восстановлению
ЭРФКИЛЛ (132)
- Операция невозможна из-за RF-kill
ЯД (133)
- На странице памяти имеется аппаратная ошибка
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Международный стандарт языка программирования C (C11), ISO/IEC 9899:2011, стр. 205
- ^ Перейти обратно: а б Международный стандарт языка программирования C (C99), ISO/IEC 9899:1999, стр. 186
- ^ «Проверка ошибок» . Библиотека GNU C (glibc) . Проект ГНУ. 8 февраля 2014 г. Проверено 25 июня 2014 г.
- ^ «Краткая характеристика Нормативного приложения 1» . Проверено 12 сентября 2013 г.
- ^ Единая спецификация UNIX , версия 4 от The Open Group : номера системных ошибок – Справочник базовых определений,
- ^ «Номера ошибок — cppreference.com» . Проверено 8 мая 2015 г.
- ^ Стивенс и Раго 2013 , с. 14.
- ^ Маккейб, Колин. «Проблема со страхом» . www.club.cc.cmu.edu .
- ^ «Коды ошибок (Библиотека GNU C)» . www.gnu.org . Проверено 21 октября 2023 г.
Библиография
[ редактировать ]- Стивенс, В. Ричард; Раго, Стивен А. (24 мая 2013 г.). Расширенное программирование в среде UNIX (Третье изд.). Аддисон-Уэсли Профессионал . ISBN 978-0321637734 . Проверено 27 февраля 2015 г.
Внешние ссылки
[ редактировать ]- FreeBSD по системным вызовам Руководство –
- Linux программиста Руководство – Библиотечные функции –
- Руководство по библиотеке GNU C: Коды ошибок
- Списки значений ошибок в Linux, как числовые, так и символические.