Глобальная переменная для значений ошибок
#include <errno.h>extern int errno;char * const sys_errlist[];int sys_nerr;
libc
Переменная errno устанавливается в текущее значение ошибки многими функциями во время возникновения ошибки.
Проверять значение переменной errno после вызова функции целесообразно только в том случае, если функция явно указывает на возникшую в процессе её выполнения ошибку (например, определённым значением возвращаемого результата). В противном случае значение errno недействительно. Также функции системной библиотеки никогда не сбрасывают значение errno в 0 в случае успешного выполнения.
В документации функции могут быть явно перечислены некоторые значения errno с уточнением их смысла. При этом функция потенциально может использовать и другие возможные значения для errno. |
Переменная errno может быть реализована как макрос, но ее значение всегда можно проверить или установить, как если бы она была простым целочисленным значением.
Каждый поток в многопоточной программе имеет собственное значение ошибки в своем локальном хранилище. Вне зависимости от того, в каком потоке Вы находитесь, Вы можете просто сослаться на errno — она определена таким образом, что всегда ссылается на корректное значение переменной для потока. Для дополнительной информации смотрите ThreadCreate(). |
В <errno.h>
также определены следующие переменные:
Значения errno включают минимум следующие значения:
Макрос | Значение |
---|---|
E2BIG | Список аргументов слишком длинный |
EACCES | Нет соответствующего разрешения |
EADDRINUSE | Адрес уже используется |
EADDRNOTAVAIL | Запрашиваемый адрес недоступен |
EADV | Ошибка объявления |
EAFNOSUPPORT | Семейство адресов не поддерживается семейством протокола |
EAGAIN | Ресурс временно недоступен; попытайтесь позднее |
EALREADY | Операция уже выполняется (смотрите “Изменения в EALREADY ” ниже) |
EBADE | Некорректный обмен |
EBADF | Некорректный файловый дескриптор |
EBADFD | Для данной операции файловый дескриптор некорректен |
EBADFSYS | Обнаружена поврежденная файловая система |
EBADMSG | Некорректное сообщение (1003.1b-1993) |
EBADR | Некорректный запрашиваемый дескриптор |
EBADRPC | Структура RPC некорректна |
EBADRQC | Некорректный код запроса |
EBADSLT | Некорректный слот |
EBFONT | Некорректный формат шрифта |
EBUSY | Устройство или ресурс заняты |
ECANCELED | Операция отменена (1003.1b-1993) |
ECHILD | Отсутствуют дочерние процессы |
ECHRNG | Значение номера канала выходит за допустимый диапазон |
ECOMM | Ошибка соединения во время отправки |
ECONNABORTED | Программное обеспечение вызвало разрыв соединения |
ECONNREFUSED | В соединении отказано |
ECONNRESET | Подключение сброшено одноранговым узлом |
ECTRLTERM | Переназначение на управляющий терминал |
EDEADLK | Избежание блокировки ресурса |
EDEADLOCK | Взаимная блокировка файла |
EDESTADDRREQ | Требуется адрес назначения |
EDOM | Математический аргумент вне области определения функции |
EDQUOT | Превышено дисковая квота |
EENDIAN | Порядок байт не поддерживается |
EEXIST | Файл существует |
EFAULT | Некорректный адрес |
EFPOS | Ошибка установки позиции в файле |
EFBIG | Файл слишком большой |
EHOSTDOWN | Хост не работает |
EHOSTUNREACH | Невозможно связаться с удаленным узлом |
EIDRM | Идентификатор удален |
EILSEQ | Некорректная последовательность байт |
EINPROGRESS | Операция выполняется в данный момент |
EINTR | Вызов функции был прерван |
EINVAL | Некорректный аргумент |
EIO | Ошибка ввода/вывода |
EISCONN | Сокет уже соединен |
EISDIR | Ожидается директория |
EL2HLT | Level 2 halted |
EL2NSYNC | Level 2 not synchronized |
EL3HLT | Level 3 halted |
EL3RST | Level 3 reset |
ELIBACC | Нет доступа к разделяемой библиотеке |
ELIBBAD | Доступ к поврежденной разделяемой библиотеке |
ELIBEXEC | Попытка выполнения разделяемой библиотеки |
ELIBMAX | Попытка связывания со слишком многим количеством библиотек |
ELIBSCN | Секция .lib в a.out повреждена |
ELNRNG | Номер ссылки вне допустимого диапазона |
ELOOP | Слишком много уровней символических ссылок или префиксов |
EMFILE | Слишком много открытых файлов |
EMLINK | Слишком много ссылок |
EMORE | Отправьте сообщение снова |
EMSGSIZE | Несоответствующая длина буфера сообщения |
EMULTIHOP | Попытка множественного перехода |
ENAMETOOLONG | Имя файла слишком длинное |
ENETDOWN | Сеть не работает |
ENETRESET | Сеть сбросила соединение во время перезапуска |
ENETUNREACH | Сеть недоступна |
ENFILE | Слишком много открытых файлов в системе |
ENOANO | Нет индексного дескриптора |
ENOBUFS | В буфере отсутствует свободное пространство |
ENOCSI | Нет доступной структуры CSI |
ENODATA | Нет данных (для ввода/вывода без задержек) |
ENODEV | Устройство отсутствует |
ENOENT | Нет указанного файла или директории |
ENOEXEC | Ошибка формата исполняемого файла |
ENOLCK | Нет доступных блокировок |
ENOLIC | Лицензия недоступна |
ENOLINK | Ссылка была разорвана |
ENOMEM | Недостаточно памяти |
ENOMSG | Нет сообщения желаемого типа |
ENONDP | Для запуска нужен NDP (8087...) |
ENONET | Компьютер находится не в сети |
ENOPKG | Пакет не установлен |
ENOPROTOOPT | Протокол недоступен |
ENOREMOTE | Должно выполняться на локальном компьютере |
ENOSPC | На устройстве не осталось свободного места |
ENOSR | Нет потоковых ресурсов |
ENOSTR | Устройство не является потоковым |
ENOSYS | Функция не реализована |
ENOTBLK | Требуется блочное устройство |
ENOTCONN | Нет соединения с сокетом |
ENOTDIR | Не является директорией |
ENOTEMPTY | Директория не пуста |
ENOTSOCK | Операция сокета для сущности, не являющейся сокетом |
ENOTSUP | Не поддерживается (1003.1b-1993) |
ENOTTY | Несоответствующая операция управления вводом/выводом |
ENOTUNIQ | Указанное имя не является уникальным |
ENXIO | Нет указанного устройства или адреса |
EOK | Успешно |
EOPNOTSUPP | Операция не поддерживается |
EOVERFLOW | Значение слишком большое для размешения в типе данных |
EOWNERDEAD | Хозяин блокировки завершен во время ее удерживания |
EPERM | Нет разрешения на операцию |
EPFNOSUPPORT | Семейство протоколов не поддерживается |
EPIPE | Канал поврежден |
EPROCUNAVAIL | Некорректная функция программы |
EPROGMISMATCH | Некорректная версия программы |
EPROGUNAVAIL | Программа RPC недоступна |
EPROTO | Ошибка протокола |
EPROTONOSUPPORT | Протокол не поддерживается |
EPROTOTYPE | Протокол имеет некорректный тип для сокета |
ERANGE | Результат слишком большой |
EREMCHG | Удаленный адрес изменился |
EREMOTE | Объект является удаленным |
ERESTART | Системный вызов должен быть перезапущен |
EROFS | Файловая система доступна только для чтения |
ERPCMISMATCH | Некорректная версия RPC |
ESHUTDOWN | Отправка после закрытия сокета невозможна |
ESOCKTNOSUPPORT | Тип сокета не поддерживается |
ESPIPE | Недопустимый поиск |
ESRCH | Процесс отсутствует |
ESRMNT | Ошибка монтирования сервера |
ESRVRFAULT | Получатель сообщения обнаружил ошибку памяти при доступе к буферу получения/отправки. |
ESTALE | Потенциально исправимая ошибка ввода/вывода |
ESTRPIPE | Для канала/FIFO - ошибка потокового канала |
ETIME | Таймер истек |
ETIMEDOUT | Таймаут соединения |
ETOOMANYREFS | Слишком много ссылок |
ETXTBSY | Текстовый файл занят |
EUNATCH | Драйвер протокола не присоединен |
EUSERS | Слишком много пользователей (для UFS) |
EWOULDBLOCK | Операция будет заблокирована |
EXDEV | Ссылка между устройствами |
EXFULL | Exchange full |
Изменения в EALREADY
POSIX требует, чтобы номера ошибок в <errno.h>
имели уникальное значение. Для удовлетворения этого требования EALREADY
изменен и не имеет одинакового значения с EBUSY
.
Это изменение могло вызвать проблемы совместимости, поскольку код, использующий в данный момент EALREADY
, был скомпилирован со старым значением. Для безопасного перехода к новому значению заголовочный файл <errno.h>
был изменен путем определения новых символьных значений:
16
). 237
). В следующей редакции значение EALREADY
будет изменено на EALREADY_NEW
. Чтобы обеспечить безопасный переход к новому значению, нужно модифицировать код следующим образом:
EALREADY
, измените его следующим образом:
#if defined( EALREADY_NEW ) && defined( EALREADY_OLD )if ( error == EALREADY_NEW || error == EALREADY_OLD ){/* deal with EALREADY error cases */}#elseif ( error == EALREADY ){/* deal with EALREADY error cases */}#endif
Это гарантирует, что код, обработает ошибку EALREADY
для любого API, возвращающего старое или новое значение.
EALREADY
, измените его, чтобы он возвращал EALREADY_DYNAMIC
. Во многих случаях этого можно добиться добавлением флага компиляции -DEALREADY=EALREADY_DYNAMIC. Можно использовать опцию -e procnto-* для установки значения EALREADY_DYNAMIC:
EBUSY
. /** The following program makes an illegal call* to the write() function, then prints the* value held in errno.*/#include <stdio.h>#include <unistd.h>#include <errno.h>#include <string.h>int main( void ){int errvalue;errno = EOK;write( -1, "hello, world\n", strlen( "hello, world\n" ) );errvalue = errno;printf( "The error generated was %d\n", errvalue );printf( "That means: %s\n", strerror( errvalue ) );}
ANSI, POSIX 1003.1
h_errno, perror(), stderr, strerror(), strerror_r()
Предыдущий раздел: Описание API системной библиотеки