Linux программирование в примерах
Шрифт:
Прежде чем рассмотреть функцию
4.3. Определение ошибок
«Если неприятность может произойти, она случается»
«Будь готов»
Ошибки могут возникнуть в любое время. Диски могут заполниться, пользователи могут ввести неверные данные, сетевой сервер, с которого осуществляется чтение, может отказать, сеть может выйти из строя и т.д. Важно всегда проверять успешность завершения каждой операции.
Основные системные вызовы Linux почти всегда возвращают при ошибке -1 и 0 или положительное значение при успехе. Это дает возможность узнать, была операция успешной или нет:
Знания того, что произошла ошибка, недостаточно. Нужно знать, какая произошла ошибка.
Хотя сама
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. Стиль сообщения об ошибках
Для использования в сообщениях об ошибках С предоставляет несколько специальных макросов. Наиболее широкоупотребительными являются