Таблица 7



Таблица 7

ECHILDНет порожденных процессов. Задача, не имеющая подзадач, выдала команду ожидания, или была выдана команда ожидания для подзадачи, имеющей признак NO-WAIT.
EAGAINБольше нет процессов. Попытка создать новый процесс окончилась неудачно, т.к. либо больше нет резервов для создания процессов, либо недостаточно оперативной памяти, либо превышен максимальный уровень вложенности процессов.
E2BIGСлишком велик список аргументов. Либо размер списка аргументов превышает 128 байт, либо требуемый размер памяти для среды превышает 32К.
EACCESДоступ запрещен. Затребованный вид доступа к файлу запрещен или несовместим с установленными атрибутами файла (или каталога). Этот код ошибки передается при попытке чтения из неоткрытого файла, при попытке записи в файл, защищенный от записи, или при попытке открыть каталог как файл.
EBADFПлохой номер файла. Номер файла, использованный при вызове функции, имеет неверное значение или не относится к открытому файлу, или сделана попытка записи в открытый только для чтения файл или устройство.
EDEADLOCKПроизошла блокировка ресурсов. Произведено 10 неудачных попыток заблокировать файл. Этот код ошибки используется только DOS версии 3.0 и более поздних версий.
EDOMОшибка в аргументе математической функции. Аргумент математической функции вышел за пределы области определения этой функции.
EEXISTФайл уже существует. Сделана попытка создать файл с именем, которое уже используется существующим файлом.
EINVALНеверный аргумент. Для одного из аргументов функции было задано неверное значение.
EMFILEОткрыто слишком много файлов. Исчерпан запас номеров файлов , нельзя больше открыть ни одного файла.
ENOENTНет такого файла или каталога. Запрошенный файл или каталог отсутствует или не может быть найден.
ENOEXECСделана попытка выполнить загрузочный файл, имеющий неправильный формат.
ENOMEMНедостаточно памяти. Эта ошибка появляется, когда недостаточно памяти для запуска процесса или для удовлетворения запроса программы на выделение блока памяти.
ENOSPCНет свободного места на устройстве. На устройстве нет места для записи информации (например, переполнился диск).
ERANGEСлишком большой результат. Слишком большой по величине аргумент математической функции привел к частичной или полной потере значимости результата.
EXDEVСвязь различных устройств. Сделана попытка переслать файл на другое устройство, используя функцию переименования.

Из приведенного выше списка кодов ошибок видно, что средствами стандартной библиотеки транслятора обрабатываются не только ошибки, возникающие при обращении к функциям DOS, но и ошибки, появляющиеся при работе с математическим функциями.

Для диагностической выдачи сообщения об ошибке можно использовать функции perror и strerror. Первая функция выводит в stderr соответствующее сообщение об ошибке, вторая только формирует строку сообщения. Функции perror и strerror имеют операнд - указатель на строку. Эта строка добавляется в начало стандартного сообщения об ошибке. Если к стандартному сообщению ничего добавлять не надо, операнд должен иметь значение NULL.

Следует заметить, что значение переменной errno отражает последнюю ошибку. Успешный вызов функции не приводит к автоматическому сбросу переменной errno.

Поэтому функции perror и strerror необходимо вызывать сразу после того, как вызываемая функция возвратит признак ошибки.

Приведем пример программы, обрабатывающей ошибки с использованием переменной errno: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> void main(int argc, char *argv[]) { FILE *stream; // Открываем файл только для чтения stream = fopen(argv[1], "r"); // Если произошла ошибка, выводим сообщение if( (stream == NULL) || (ferror(stream)) ) { perror("Не могу открыть файл"); exit(errno); } // Пытаемся произвести запись в файл, который // открыт только для чтения. Это приведет к ошибке. fprintf(stream, "Пишем в файл\n"); if( (stream == NULL) || (ferror(stream)) ) { // Выводим сообщение об ошибке двумя способами - // с помощью функции perror и strerror perror("Запись в защищенный файл"); printf("Запись в защищенный файл: %s\n", strerror(errno)); exit(errno); } exit( 0 ); }

DOS имеет еще одно средство для обработки ошибок - обработчик критических ошибок (Critical Error Handler). Этот модуль вызывается DOS, когда она получает сообщение об ошибке от драйвера устройства.

Модуль выдает на экран хорошо известное вам сообщение: Abort, Retry, Ignore?

Это сообщение обычно появляется тогда, когда вы забываете вставить дискету или начинаете печатать при отключенном принтере.

Прикладные программы могут подключать свой модуль обработки критических ошибок вместо стандартного. Мы научимся обрабатывать критические ошибки в книге 3. Там же будет приведен соответствующий пример.



- Начало - - Назад - - Вперед -