2852

Обработка системных ошибок

Контрольная

Информатика, кибернетика и программирование

Обработка системных ошибок В стандартной библиотеке stdlib.h объявлена переменная errno типа int, которая содержит код системной ошибки, значение переменной устанавливается ОС после выполнения каждой системной операции. В стандартной библиотеке errn...

Русский

2012-10-20

65.5 KB

5 чел.

Обработка системных ошибок

В стандартной библиотеке stdlib.h объявлена переменная errno типа int, которая содержит код системной ошибки, значение переменной устанавливается ОС после выполнения каждой системной операции. В стандартной библиотеке errno.h объявлены макросы, идентифицирующие коды ошибок, переменная errno принимает значения этих макросов. Ниже в таблице приведены значения макросов, идентифицирующих коды ошибок при работе с файлами и программами.

Имя макроса

Значение

Примечание

EACCES

5

Нет прав доступа

EBADF

6

Неправильный дескриптор

EEXIST

35

Файл уже существует

EMFILE

4

Слишком много открытых файлов

ENOENT

2

Файл не найден

ENOTSAM

17

Неверно задано устройство

E2BIG

20

Слишком большой список аргументов

ENOEXEC

21

Ошибка формата исполнимого файла

ENOMEM

8

Нет свободной памяти

EINVAL

19

Неправильный аргумент

Запуск внешних программ на выполнение

В стандартной библиотеке 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

0

Вызывающая программа приостанавливается и ждет, пока выполняется вызываемая программа, после завершения вызываемой программы продолжает выполняться вызывающая программа.

P_OVERLAY

2

Аналогично функциям семейства 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.  Передача существующим префиксам описаний других файлов.

При окончании работы с файлом производится его закрытие, разрушается служебная информация о нём, ОС записывает при необходимости содержимое буферной области в файл и освобождает буферную область, обновляя информацию в директории, в который входит этот файл.

Стандартные символьные устройства автоматически открываются ОС при запуске любой программы и закрываются при её завершении, поэтому их не надо открывать программными средствами.


 

А также другие работы, которые могут Вас заинтересовать

83822. Сосудисто – нервный пучок плеча. Лучевой, локтевой и срединный нерв. Перевязка плечевой артерии 60.11 KB
  Лучевой локтевой и срединный нерв. Название сосудов и нервов Верхняя треть плеча Средняя треть плеча Нижняя треть плеча . medinus Сосудистонервный пучок проходит в sulcus bicipitlis medilis причём несколько прикрыт внутренним краем двуглавой мышцы плеча задняя стенка влагалища которой образует влагалище сосудов и нерва.
83823. Артерии предплечья. Артериальные коллатерали локтевой области. Перевязка лучевой и локтевой артерии 50.4 KB
  Артерия предплечья Лучевая артерия отходит от плечевой артерии в локтевой ямке направляется в латеральный канал предплечья лучевая борозда где проходит в сопровождении поверхностной ветви лучевого нерва. Далее локтевая артерия проходит позади плечевой головки круглого пронатора и срединного нерва вниз и медиально ложится в средней трети предплечья в медиальный канал предплечья приближаясь к проходящему в канале локтевому нерву. Медиальный канал предплечья ограничен медиально локтевым сгибателем запястья латерально поверхностным...
83824. Пространство Пирогова – Парона. Вскрытие флегмон предплечья 50 KB
  Вскрытие флегмон предплечья. Между мышцами третьего и четвертого слоя располагается глубокая часть переднего фасциального ложа предплечья или клетчаточное пространство Пароны Пирогова. brchiordilis; медиально собственная фасция предплечья сросшаяся с локтевой костью; вверху место прикрепления к межкостной перепонке m. Флегмона предплечья Вскрытие флегмоны предплечья выполняет бригада состоящая из хирурга и ассистента.
83825. Клетчаточные пространства ладони. Воспалительные заболевания кисти. Вскрытие флегмон кисти 53.62 KB
  Воспалительные заболевания кисти. Вскрытие флегмон кисти. Границей отделяющей клетчатку запястья от клетчатки кисти является дистальная кожная складка запястья. Флегмона кисти Флегмона кисти хирургическое заболевание характеризующееся развитием гнойного процесса в переделах одного или нескольких клетчаточных пространств кисти.
83826. Сосуды и нервы кисти. Ладонные дуги. Синовиальные влагалища кисти 50.97 KB
  Она образована поверхностной ладонной ветвью лучевой артерии соединяющейся с окончанием ствола локтевой артерии. От поверхностной ладонной дуги отходят 3 общие пальцевые ладонные артерии каждая из которых делится на две собственные ладонные пальцевые артерии идущие по боковой стороне пальцев. Ее образует конечный ствол лучевой артерии сливающийся с глубокой ветвью локтевой артерии. От глубокой ладонной дуги отходят три ладонные пястные артерии соединяющиеся с концами общепальцевых артерий у межпальцевых складок.
83827. Виды панариция. Операции при панариции. Операции при костном панариции 59.03 KB
  Операцию завершают тщательным туалетом раны 3 раствором перекиси водорода и наложением асептической влажновысыхающсй спиртгипсртонической повязки. В послеоперационном периоде перевязки выполняют ежедневно до полной эпителизации раны. Производят тщательную ревизию и туалет раны. Углы раны иссекают клиновидно.
83828. Ампутация пальца кисти, показания, техника 48.77 KB
  Травматический отрыв конечности Развившаяся гангрена Третье абсолютное показание к ампутации характеризуется триадой повреждения конечности. А повреждение двух третей мягких тканей Б повреждение и размозжение крупных сосудисто нервных пучков С повреждение костей Относительные показания это такие показания когда вопрос об ампутации или экзартикуляции конечности решается с учетом состояния больного в каждом конкретном случае в индивидуальном порядке. Оперировать необходимо только в том случае если травма или заболевание...
83829. Топографическая анатомия ягодичной области. Хирургическая тактика при ранении ягодичной области 54.75 KB
  Хирургическая тактика при ранении ягодичной области. отделе среднеягодичной мышцы затем образует влагалище для большой ягодичной мышцы. Грушевидная мца делит большое седалищное отверстие на formen suprpiriforme образовано нижним краем средней ягодичной мышцы и верхним краем грушевидной мцы.
83830. Сосуды и нервы бедра. Бедренная артерия, бедренная вена, седалищный нерв 54.02 KB
  Область бедра Границы: Верхняя передняя паховая связка или соответствующая ей паховая складка; верхняя задняя ягодичная складка; нижняя кру говая линия проведенная на 4 см выше основания надколенника. Передняя область бедра Кожные нервы формируются из поясничного сплетения: r. cutneus femoris lterlis снабжает наружную поверхность бедра: пп.