Linux программирование в примерах
Шрифт:
4.3.1. Значения
Стандарт POSIX 2001 определяет большое число возможных значений для errno. Многие из них относятся к сетям, IPC или другим специальным задачам. Справочная страница для каждого системного вызова описывает возможные значения
Таблица 4.1. Значения GLIBC для
Имя | Значение |
---|---|
E2BIG | Слишком длинный список аргументов |
EACCESS | Доступ запрещен |
EADDRINUSE | Адрес используется |
EADDRNOTAVAIL | Адрес недоступен |
EAFNOSUPPORT | Семейство адресов не поддерживается |
EAGAIN | Ресурс недоступен, попытайтесь снова (может быть то же самое значение, что EWOULDBLOCK ). |
EALREADY | Соединение
|
EBADF | Ошибочный дескриптор файла. |
EBADMSG | Ошибочное сообщение. |
EBUSY | Устройство или ресурс заняты |
ECANCELED | Отмена операции. |
ECHILD | Нет порожденного процесса. |
ECONNABORTED | Соединение прервано |
ECONNFRFUSED | Соединение отклонено |
ECONNRESET | Восстановлено исходное состояние соединения. |
EDEADLK | Возможен тупик (deadlock) в запросе ресурса. |
EDESTADDRREQ | Требуется адрес назначения |
EDOM | Математический аргумент выходит за область определения функции |
EDQUOT | Зарезервировано. |
EEXIST | Файл существует. |
EFAULT | Ошибочный адрес. |
EFBIG | Файл слишком большой. |
EHOSTUNREACH | Хост недоступен. |
EIDRM | Идентификатор удален |
EILSEQ | Ошибочная последовательность байтов. |
EINPROGRESS | Операция исполняется. |
EINTR | Прерванная функция. |
EINVAL | Недействительный аргумент. |
EIO | Ошибка ввода/вывода. |
EISCONN | Сокет (уже) соединен. |
EISDIR | Это каталог. |
ELOOP | Слишком много уровней символических ссылок. |
EMFILE | Слишком много открытых файлов. |
EMLINK | Слишком много ссылок. |
EMSGSIZE | Сообщение слишком длинное. |
EMULTIHOP | Зарезервировано. |
ENAMETOOLONG | Имя файла слишком длинное |
ENETDOWN | Сеть не работает |
ENETRESET | Соединение прервано сетью |
ENETUNREACH | Сеть недоступна. |
ENFILE | В системе открыто слишком много файлов. |
ENOBUFS | Буферное пространство недоступно. |
ENODEV | Устройство отсутствует |
ENOENT | Файл или каталог отсутствуют |
ENOEXEC | Ошибочный формат исполняемого файла. |
ENOLCK | Блокировка недоступна. |
ENOLINK | Зарезервировано. |
ENOMEM | Недостаточно памяти. |
ENOMSG | Сообщение нужного типа отсутствует |
ENOPROTOOPT | Протокол недоступен. |
ENOSPC | Недостаточно памяти в устройстве. |
ENOSYS | Функция не поддерживается. |
ENOTCONN | Сокет не соединен. |
ENOTDIR | Это не каталог |
ENOTEMPTY | Каталог не пустой. |
ENOTSOCK | Это не сокет |
ENOTSUP | Не поддерживается |
ENOTTY | Неподходящая операция управления вводом/выводом |
ENXIO | Нет такого устройства или адреса. |
EOPNOTSUPP | Операция сокета не поддерживается |
EOVERFLOW | Слишком большое значение для типа данных |
EPERM | Операция не разрешена |
EPIPE | Канал (pipe) разрушен |
EPROTO | Ошибка протокола. |
EPROTONOSUPPORT | Протокол не поддерживается |
EPROTOTYPE | Ошибочный тип протокола для сокета |
ERANGE | Результат слишком большой |
EROFS | Файловая система только для чтения |
ESPIPE | Недействительный поиск |
ESRCH | Нет такого процесса |
ESTALE | Зарезервировано |
ETIMEDOUT | Тайм-аут соединения истек |
ETXTBSY | Текстовый файл занят |
EWOULDBLOCK | Блокирующая операция (может быть то же значение, что и для EAGAIN ) |
EXDEV | Ссылка через устройство (cross-device link) |
Многие системы предоставляют также другие значения ошибок, а в более старых системах может не быть всех перечисленных значений ошибок. Полный список следует проверить с помощью справочных страниц intro(2) и errno(2) для локальной системы.
ЗАМЕЧАНИЕ.
Сначала мы используем
Функция
Мы предпочитаем функцию
По всей книге вы увидите множество примеров использования обеих функций.
4.3.2. Стиль сообщения об ошибках
Для использования в сообщениях об ошибках С предоставляет несколько специальных макросов. Наиболее широкоупотребительными являются
Здесь сообщение об ошибке включает не только имя программы, но также и имя функции, имя исходного файла и номер строки. Полный список идентификаторов, полезных для диагностики, приведен в табл. 4.2.
Таблица 4.2. Диагностические идентификаторы C99
Идентификатор | Версия С | Значение |
---|---|---|
__DATE__ | C89 | Дата компиляции в виде « Mmm nn yyyy » |
__FILE_ | Оригинальная | Имя исходного файла в виде « program.c » |
__LINE__ | Оригинальная | Номер строки исходного файла в виде 42 |
__TIME__ | C89 | Время компиляции в виде « hh:mm:ss » |
__func__ | C99 | Имя текущей функции, как если бы было объявлено const char __func__[] = "name" |
Использование
Сегодня, хотя системы GNU/Linux поставляются с исходными кодами, указанный исходный код часто не устанавливается по умолчанию. Поэтому использование этих идентификаторов для сообщений об ошибках не представляет дополнительной ценности. GNU Coding Standards даже не упоминает их.
4.4. Ввод и вывод
Все операции Linux по вводу/выводу осуществляются посредством дескрипторов файлов. Данный раздел знакомит с дескрипторами файлов, описывает, как их получать и освобождать, и объясняет, как выполнять с их помощью ввод/вывод.
4.4.1. Понятие о дескрипторах файлов
Дескриптор файла является целым значением. Действительные дескрипторы файлов начинаются с 0 и растут до некоторого установленного системой предела. Эти целые фактически являются индексами таблицы открытых файлов для каждого процесса (Таблица поддерживается внутри операционной системы; она недоступна запущенным программам.) В большинстве современных систем размеры таблиц большие. Команда '
Из С максимальное число открытых файлов возвращается функцией
Следующая небольшая программа выводит результат работы этой функции: