Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.

[Назад] [Содеожание] [Дальше]

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 необходимо вызывать сразу после того, как вызываемая функция возвратит признак ошибки.

[Назад] [Содеожание] [Дальше]