- •1. Структура и принципы работы ms-dos
- •1.1. Основные компоненты операционной системы
- •Msdos.Sys
- •Command.Com
- •Config.Sys
- •Autoexec.Bat
- •Wina20.386
- •Драйверы
- •Внешние команды
- •Подготовка системной дискеты
- •Программа fdisk
- •Резидентные программы
- •1.2. Процесс загрузки операционной системы
- •1.3. Состав и общая схема работы ms-dos
- •Файловая система
- •Система управления памятью
- •Система управления программами
- •Система связи с драйверами устройств
- •Система обработки ошибок
- •Служба времени
- •Работа с консолью оператора
- •Другие системы ms-dos
- •1.4. Обзор прерываний bios
- •Определение конфигурации компьютера
- •Определение объема оперативной памяти
- •Работа с видеоконтроллером
- •Выбрать видеорежим (00h)
- •Установить размеры и форму курсора (01h)
- •Свернуть окно (06h, 07h)
- •Работа с клавиатурой
- •Обслуживание дисковой подсистемы
- •Перезагрузка операционной системы
- •Системный сервис для машин класса at
- •1.5. Обзор прерываний ms-dos
- •Получение системной информации
- •Символьный ввод и вывод
- •Работа с файловой системой
- •Управление программами
- •Управление памятью
- •Связь с драйверами устройств
- •Другие функции
- •1.6. Обработка ошибок
- •1.7. Вызов прерываний ms-dos
- •1.8. Программа errcode
- •1.9. Переменная errno
- •1.10. Программа errno
1.9. Переменная errno
Если ваша программа, составленная на языке С, вызывает программные прерывания MS-DOS неявным образом (через функции стандартной библиотеки транслятора, такие как fprintf, puts и т. д.), то можно воспользоваться средствами обработки ошибок, входящими в состав стандартной библиотеки.
Когда при обращении к прерываниям MS-DOS средствами стандартной библиотеки транслятора С возникает ошибка, то в глобальную переменную с именем errno записывается код ошибки.
Приведем список кодов ошибок в виде символических констант, определенных в файле errno.h.
Код ошибки |
Описание |
EZERO (0) |
Нет ошибки |
EINVFNC (1) |
Неправильный номер функции |
ENOFILE, (2) ENOENT |
Файл или каталог не найден.Запрошенный файл или каталог отсутствует, либо не может быть найден |
ENOPATH (3) |
Путь не найден |
EMFILE (4) |
Слишком много открытых файлов |
EACCES (5) |
Доступ запрещен.Затребованный вид доступа к файлу запрещен или несовместим с установленными атрибутами файла (или каталога). Этот код ошибки передается при попытке чтения из неоткрытого файла, при попытке записи в файл, защищенный от записи, или при попытке открыть каталог как файл |
EBADF (6) |
Плохой идентификатор файла (handle).Идентификатор файла, использованный при вызове функции, имеет неверное значение или не относится к открытому файлу. Возможно, сделана попытка записи в файл, открытый только для чтения, или попытка вывода данных на устройство, открытое только для чтения |
ECONTR (7) |
Указанный блок памяти уничтожен |
ENOMEM (8) |
Слишком мало памяти.Эта ошибка появляется, когда не хватает памяти для запуска процесса или для удовлетворения запроса программы на выделение блока памяти |
EINVMEM (9) |
Неправильный адрес блока памяти |
EINVENV (10) |
Неправильная среда |
EINVFMT (11) |
Неправильный формат |
EINVACC (12) |
Неправильный код доступа |
EINVDAT, (13) |
Неправильные данные |
EINVDRV, (15) ENODEV |
Ошибка при указании дискового устройства |
ECURDIR (16) |
Сделана попытка удаления текущего каталога |
ENOTSAM (17) |
Сделана попытка переместить файл на другое устройство при помощи функции, которая может выполнить эту операцию только в пределах одного устройства |
ENMFILE (18) |
Нет свободных идентификаторов файлов.Исчерпан запас идентификаторов файлов, поэтому больше нельзя открыть ни один файл |
EINVAL (19) |
Неправильный параметр.Для одного из параметров функции было задано неверное значение |
E2BIG (20) |
Слишком длинный список параметров. Либо размер списка превышает 128 байт, либо требуемый размер памяти для среды превышает 32 Кбайт |
ENOEXEC (21) |
Ошибка в формате исполняемого файла.Сделана попытка выполнить файл, имеющий неправильный формат |
EXDEV (22) |
Связь различных устройств.Сделана попытка переслать файл на другое устройство, используя функцию переименования |
EDOM (33) |
Ошибка в аргументе математической функции. Аргумент математической функции вышел за пределы области определения этой функции |
ERANGE (34) |
Слишком большой результат, который привел к частичной или полной потере значимости |
EEXIST (35) |
Файл уже существует. Сделана попытка создать файл с именем, которое уже используется существующим файлом |
EDEADLOCK (36) |
Произошла блокировка ресурсов. Выполнено 10 неудачных попыток заблокировать файл |
Из приведенного выше списка кодов ошибок видно, что средствами стандартной библиотеки транслятора обрабатываются не только ошибки, возникающие при обращении к функциям MS-DOS, но и ошибки, появляющиеся при работе с математическим функциями.
Для диагностической выдачи сообщения об ошибке можно использовать функции perror и strerror. Первая функция записывает в поток вывода stderr соответствующее сообщение об ошибке, вторая только формирует строку сообщения.
Функции perror и strerror имеют параметр - указатель на строку. Эта строка добавляется в начало стандартного сообщения об ошибке. Если к стандартному сообщению ничего добавлять не надо, параметр должен иметь значение NULL.
Следует заметить, что значение переменной errno отражает последнюю ошибку. Успешный вызов функции не приводит к автоматическому сбросу переменной errno. Поэтому функции perror и strerror необходимо вызывать сразу после того, как вызываемая функция возвратит признак ошибки.