MS-DOS для программиста
© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.
Если ваша программа, составленная на языке С,
вызывает программные прерывания 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
необходимо вызывать сразу после того, как
вызываемая функция возвратит признак ошибки.
|