
- •Часть первая. Введение в операционную систему Linux
- •Глава 1. Обзор возможностей операционной системы Linux 1
- •Глава 2. Стандартизация unix-подобных операционных систем 23
- •Глава 1. Обзор возможностей операционной системы Linux
- •1.1. Введение
- •1.2. Краткая история Linux
- •1.3. Архитектура unix-подобных операционных систем
- •1.4. Введение в архитектуру ядра unix-подобных операционных систем
- •1.5. Справочная подсистема (man)
- •1.6. Файлы и каталоги
- •1.7. Ввод и вывод
- •1.8. Программы и процессы
- •1.9. Обработка ошибок
- •1.10. Вход в систему и идентификация пользователя
- •1.11. Сигналы
- •1.12. Интерпретатор shell
- •1.12.1. Сокращенное имя файла
- •1.12.2. Переключение ввода-вывода
- •1.12.3. Программные каналы
- •1.12.4. Создание среды
- •1.13. Системные вызовы и библиотечные функции
- •1.14. Выводы по главе 1
- •1.15. Упражнения по главе 1
- •Глава 2. Стандартизация unix-подобных операционных систем
- •2.1. Введение
- •2.2. Стандарты unix
- •2.2.1. Iso c
- •2.2.2. Ieee Posix
- •2.2.3. Single unix Specification
- •2.3. Пределы
- •2.4. Функции sysconf, pathconf и fpathconf
- •2.5. Элементарные системные типы данных
- •2.6. Выводы по главе 2
- •2.7. Упражнения по главе 2
1.9. Обработка ошибок
Очень часто при возникновении ошибки в любой из функций системы UNІX эта функция возвращает отрицательное число, а в глобальную переменную errno записывается некоторое целое число, которое несет дополнительную информацию о возникшей ошибке. Например, функция open возвращает либо файловый дескриптор – неотрицательное число, либо –1 – в случае возникновения ошибки. Вообще через переменную errno функция open может возвращать 15 различных кодов ошибок, таких как отсутствие файла, недостаточность прав доступа и тому подобное. Некоторые функции следуют иному соглашению. Например, большинство функций, которые должны возвращать указатель на какой-либо объект, в случае ошибки возвращают пустой указатель.
Определения переменной errno и констант всех возможных кодов ошибок находятся в заголовочном файле <errno.h>. Имена констант начинаются с символа E. Кроме того, в ОС Linux коды ошибок и соответствующие им имена констант перечислены на странице errno(3) справочного руководства.
Для вывода сообщений об ошибках стандарт языка C предусматривает две функции.
#include <string.h>
char *strerror (int errnum);
/* функция возвращает указатель на строку сообщения об ошибке */
Эта функция преобразует код ошибки errnum, обычно равный значению errno, в строку сообщения об ошибке и возвращает указатель на нее.
Функция perror, основываясь на значении errno, выводит сообщение об ошибке на стандартный вывод сообщений об ошибках и возвращает управление.
#include <stdio.h>
void perror (const char *msg);
Она выводит строку сообщения msg, двоеточие, пробел и текст сообщения об ошибке, соответствующий значению errno. Вывод заканчивается символом перевода строки.
Ошибки, определенные в файле <errno.h>, могут быть разделены на две категории – фатальные и нефатальные. Восстановление нормальной работы после фатальных ошибок невозможно. Самое лучшее, что можно сделать в данной ситуации, – это вывести сообщение об ошибке на экран или записать его в файл журнала и завершить работу приложения. Нефатальные ошибки допускают нормальное продолжение работы. Большинство нефатальных ошибок по своей природе носят временный характер (например, нехватка ресурсов), и их можно избежать при меньшей загруженности системы.
К нефатальным ошибкам, связанным с нехваткой ресурсов, относятся EAGAIN, ENFILE, ENOBUFS, ENOLCK, ENOSPC, ENOSR, EWOULDBLOCK и иногда ENOMEM. Если ошибка EBUSY указывает на то, что разделяемый ресурс в настоящий момент времени занят, она также может рассматриваться как нефатальная.
Для восстановления после вышеперечисленных ошибок, как правило, достаточно приостановить работу на короткое время и повторить попытку. Эта методика может применяться и в других ситуациях. Например, если ошибка свидетельствует о разрыве сетевого соединения, можно подождать некоторое время и затем попытаться восстановить соединение. В некоторых приложениях используется алгоритм экспоненциального увеличения времени задержки, когда пауза между попытками увеличивается при каждой итерации.
В конечном счете, сам разработчик приложения решает, после каких ошибок возможно продолжение работы. Применяя разумную стратегию восстановления после ошибок, мы можем существенно повысить отказоустойчивость приложения и избежать аварийного завершения его работы.