Реферат Курсовая Конспект
Лекция 28 - Лекция, раздел Информатика, Лекция 28 Обработка Системных Ошибок ...
|
Обработка системных ошибок
В стандартной библиотеке stdlib.h объявлена переменная errno типа int, которая содержит код системной ошибки, значение переменной устанавливается ОС после выполнения каждой системной операции. В стандартной библиотеке errno.h объявлены макросы, идентифицирующие коды ошибок, переменная errno принимает значения этих макросов. Ниже в таблице приведены значения макросов, идентифицирующих коды ошибок при работе с файлами и программами.
Имя макроса | Значение | Примечание |
EACCES | Нет прав доступа | |
EBADF | Неправильный дескриптор | |
EEXIST | Файл уже существует | |
EMFILE | Слишком много открытых файлов | |
ENOENT | Файл не найден | |
ENOTSAM | Неверно задано устройство | |
E2BIG | Слишком большой список аргументов | |
ENOEXEC | Ошибка формата исполнимого файла | |
ENOMEM | Нет свободной памяти | |
EINVAL | Неправильный аргумент |
Запуск внешних программ на выполнение
В стандартной библиотеке process.h объявлены функции, позволяющие из программы запускать на выполнение другую программу.
Семейства функций exec и spawn.
int execl(char* path, char* arg0, ..., NULL);
int execle(char* path, char* arg0, ..., NULL, char** env);
int execlp(char* path, char* arg0, ... NULL);
int execlpe(char* path, char* arg0, ..., NULL, char** env);
int execv(char* path, char* argv[]);
int execve(char* path, char* argv[], char** env);
int execvp(char* path, char* argv[]);
int execvpe(char* path, char* argv[], char** env);
int spawnl(int mode, char* path, char* arg0, ..., NULL);
int spawnle(int mode, char* path, char* arg0, ..., NULL, char** env);
int spawnlp(int mode, char* path, char* arg0, ..., NULL);
int spawnlpe(int mode, char* path, char* arg0, ..., NULL, char** env);
int spawnv(int mode, char* path, char* argv[]);
int spawnve(int mode, char* path, char* argv[], char** env);
int spawnvp(int mode, char* path, char* argv[]);
int spawnvpe(int mode, char* path, char* argv[], char** env);
Функции вызывают на выполнение программу, имя которой указывается в переменной path. При этом для функций семейства exec происходит замещение в памяти вызывающей программы программой, вызываемой функцией. То есть если вызов функции прошел успешно, то вызывающая программа прекращает выполняться, и дальше выполняется вызываемая программа, которая после своего завершения передает управление ОС. Для функций семейства spawn режим работы задается параметром mode. В файле process.h объявлены макросы, задающие режимы вызова функций. Ниже в таблице перечислены имена и значения макросов и описание режимов работы функций семейства spawn.
Макрос | Значение | Режим работы |
P_WAIT | Вызывающая программа приостанавливается и ждет, пока выполняется вызываемая программа, после завершения вызываемой программы продолжает выполняться вызывающая программа. | |
P_OVERLAY | Аналогично функциям семейства exec. |
Назначение остальных параметров и особенности выполнения различных функций зависит от суффиксов, присутствующих в имени функции. Ниже в таблице дана расшифровка суффиксов функций.
Суффикс | Описание |
l | Указатели типа char* на параметры командной строки вызываемой программы передаются раздельно |
v | Указатели типа char* на параметры командной строки вызываемой программы передаются через массив указателей |
e | В вызываемую программу передаются ее переменные окружения. Если суффикс e отсутствует, то вызываемая программа будет использовать переменные окружения вызывающей программы |
p | Функция при поиске файла вызываемой программы будет использовать переменную окружения PATH |
При вызове все открытые в вызывающей программе файлы остаются открытыми в вызываемой программе.
В случае успешного вызова функция семейства exec не возвращается в вызываемую программу, а функция семейства spawn возвращает статус завершения программы (для программы на языке C это значение, которое возвращает функция main(), при правильном завершении работы программы это должен быть 0). В случае неудачного вызова функции семейства exec и spawn возвращают в вызывающую функцию –1 и записывают в переменную errno код ошибки. Для функций семейства exec возможны следующие ошибки, описанные соответствующими макросами: E2BIG, EACCES, EMFILE, ENOENT, ENOEXEC, ENOMEM. Для функций семейства spawn возможны следующие ошибки: E2BIG, EINVAL, ENOENT, ENOEXEC, ENOMEM.
Пример 1
Файл child.cpp
#include <stdio.h>
void main (void)
{
printf("nSecond process");
}
Файл parent.cpp
#include <stdio.h>
#include <process.h>
#include <errno.h>
void main (void)
{
int res;
char path[]="C:\WORK\CHILD.EXE";
printf("nParent process start");
res=execl(path,path,NULL);
printf("nParent process finish %d",errno);
}
Файл child.exe должен находиться в каталоге C:WORK. При запуске программы parent.exe на экран будет выведено следующее:
Parent process start
Second process
Пример 2
Файл child.cpp
#include <stdio.h>
int main (void)
{
printf("nSecond process ");
return 0;
}
Файл parent.cpp
#include <stdio.h>
#include <process.h>
#include <errno.h>
void main (void)
{
int res;
char path[]="C:\WORK\CHILD.EXE";
printf("nParent process start");
res=spawnl(P_WAIT,path,path,NULL);
if (res==-1)
printf("error code = %d",errno);
printf("nParent process finish");
}
Файл child.exe должен находиться в каталоге C:WORK. При запуске программы parent.exe на экран будет выведено следующее:
Parent process start
Second process
Parent process finish
Файловая система MS-DOS
Файл в ОС MS-DOS – это именованный объект, в котором хранится информация. Файловая система – это совокупность файлов и управляющей информации о файлах, а также набор программных средств ОС для доступа к файлам. MS-DOS поддерживает 3 типа файлов.
1. Регулярный файл – это обычный файл на диске. Физически он состоит из совокупности блоков фиксированной длины (секторов).
2. Специальный символьный файл – логическое представление драйвера символьного внешнего устройства.
3. Директорий – специальный файл, хранящий информацию о регулярных файлах и вложенных директориях.
Для некоторых символьных устройств в MS-DOS используются стандартные зарезервированные имена.
Имя | Устройство |
CON | Консоль |
AUX или COM1 | 1-й порт последовательного адаптера |
COM2 | 2-й порт последовательного адаптера |
COM3 | 3-й порт последовательного адаптера |
COM4 | 4-й порт последовательного адаптера |
PRN или LPT1 | 1-й порт параллельного адаптера |
LPT2 | 2-й порт параллельного адаптера |
LPT3 | 3-й порт параллельного адаптера |
NUL | Фиктивное устройство. EOF при попытке ввода с него, вывод – в никуда |
При работе с символьными устройствами каждый драйвер организует работу с одним физическим устройством, при работе с блоковыми устройствами одно физическое устройство может быть использовано для организации нескольких логических устройств, обмен с которыми поддерживает один драйвер. Для доступа к подобным устройствам используются буквы латиницы (A,B – для доступа в приводам гибких дисков, C и далее – для доступа к жестким дискам).
Логическая структура файла представляет собой конечную последовательность байтов. Если к файлу организуется доступ, то с этой последовательностью связывается указатель чтения-записи – это указатель на позицию в файле (потоке), куда будет произведено следующее обращение (чтение или запись) за данными. Данный указатель смещается автоматически при операциях чтения-записи, но может быть и установлен явно. Если указатель достиг конца файла, то ОС фиксирует эту ситуацию и запрещает дальнейшее перемещение указателя, генерируя код ошибки EOF при каждой новой попытке доступа. Смещение за конец файла возможно лишь при некоторых режимах записи в файл.
Возможно произвольное перемещение указателя чтения-записи в любую позицию в файле.
Доступ к файлу становится возможным только после его открытия, то есть проведения ОС определённых действий, приводящих к закреплению за этим файлом буферной области в ОЗУ и созданию специальной управляющей информации о нём. Эта информация записывается в структурную переменную, которая помещается в массив описаний открытых файлов, хранимый ОС. Обмен с файлом организуется с использованием ссылок (префиксов) на соответствующую структурную переменную. При открытии файла за ним закрепляется префикс (иногда называемый дескриптором). Физически префикс файла представляет собой смещение элемента типа char в таблице открытых файлов. Каждый элемент этой таблицы – это ссылка на соответствующую этому файлу структурную переменную из массива открытых файлов, то есть смещение этой структурной переменной относительно начала массива. Схематически это представлено на рисунке 1.
Рис. 1
Допустимы следующие операции.
1. Неоднократное открытие файла, каждый раз для него будет создаваться новый префикс и создаваться дубль описания.
2. Дублирование префиксов и описания.
3. Передача существующим префиксам описаний других файлов.
При окончании работы с файлом производится его закрытие, разрушается служебная информация о нём, ОС записывает при необходимости содержимое буферной области в файл и освобождает буферную область, обновляя информацию в директории, в который входит этот файл.
Стандартные символьные устройства автоматически открываются ОС при запуске любой программы и закрываются при её завершении, поэтому их не надо открывать программными средствами.
– Конец работы –
Эта тема принадлежит разделу:
На сайте allrefs.net читайте: Лекция 28.
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Лекция 28
Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов