Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PR_СП_лабы_11.doc
Скачиваний:
7
Добавлен:
22.04.2019
Размер:
755.71 Кб
Скачать

Лабораторна робота №4. Контроль виконання програми

Мета: Оволодіння методами контролю помилок при розробці програм. Знайомство з організацією та доступу к системному масиву помилок. Знайомство з функціями обробки помилок.

Завдання для самостійної підготовки:

Вивчити:

  • синтаксис та правила вживання функцій обробки помилок;

  • організацією та правила доступу к системному масиву помилок.

  • правила використання контролю помилок в програмі.

Методичні вказівки

1. Коди завершення програми

Коли програма завершує роботу, вона повідомляє операційну систему про свій з стоянні, посилаючи їй код завершення. У більшості інтерпретаторів команд код завершення останньої виконаної програми міститься в спеціальній змінній $?.

Код завершення дорівнює (за існуючою угодою):

  • нуль, якщо програма завершена успішно (через виклики процедур ABORT або EXIT або закінчиться робота процедури main)

  • не рівне нулю 16-розрядне ціле число при наявності помилки.

Зручно різними ненульовими кодами позначати різні помилкові ситуації.

Основні ситуації, що призводять до збоїв системних викликів:

1. Ліміт ресурсів. У системі можуть закінчитися ресурси або програма може вичерпати ліміт ресурсів, накладений на неї системою. Наприклад, програма може запросити занадто багато пам'яті, записати надто великий обсяг даних на диск або від крити надмірна кількість файлів одночасно.

2. Обмеження прав доступу. Про грама намагається виконати операцію за відсутності належних привілеїв. На приклад, програма може спробувати здійснити запис в доступний тільки для читання файл, звернутися до пам'яті іншого процесу або знищити програму іншого користувача.

3. Помилкові аргументи. Аргументи системного виклику можуть виявитися неправильними або через помилково введених користувачем даних, або із-за помилки самої програми. Наприклад, програма може передати системному виклику неправильна адреса пам'яті або невірний дескриптор файлу. Інший варіант помилки - спроба відкрити каталог замість звичайного файлу або передати ім'я файлу системного виклику, очіку дає ім'я каталогу.

4. Помилки пристроїв. Системний виклик може аварійно завершитися з причин, не залежних від са мій програми. Найчастіше це відбувається при доступі до апаратних пристроїв. Пристрій може працювати некоректно або не підтримувати потрібну операцію, або в дисковод просто не вставлений диск.

5. Зовнішні впливи. Виконання системного виклику іноді переривається зовнішніми подіями, до како вим відноситься, наприклад, отримання сигналу. Це не обов'язково означає помилку, але відповідальність за перезапуск системного виклику покладається на програму.

У випадку помилки системні виклики, як правило, повертають -1, покажчик NULL, або константу типу EOF. Але це значення повернення повідомляє тільки те, що помилка сталася. Але для більш спеціалізованої обробки помилок необхідні додаткові відомості

Більшість системних викликів (приблизно 80%) зберігають у спеціальної змінної errno розширену інформацію про помилку, що відбулася. Змінна errno містить номер помилки системи. Оскільки всі системні виклики працюють із однієї й т же змінної, змінна errno модифікується після кожного системного виклику.

Можливі значення errno задаються макроконстантами препроцесора, які, записуються прописними буквами й починаються з літери "E", наприклад EACCES і EINVAL. При роботі значеннями змінної errno варто завжди використовувати макроконстанти, а не реальні числові значення помилок. Всі ці константи визначені у файлі <errno. h>.

Текст діагностичного повідомлення зберігається у визначеному масиві sys_errlist, що зберігається в стандартній бібліотеці.

Змінна sys_nerr містить розмір цього масиву. Змінна errno може використовуватися як індекс у цьому масиві.

Стандарт POSIX визначає наступні символьні імена помилок:

E2BIG - Список аргументів занадто довгий

EACCES - Відмова в доступі

EAGAIN - Ресурс тимчасово недоступний

EBADF - Неправильний дескриптор файлу

EBADMSG - Неправильне повідомлення

EBUSY - Ресурс зайнятий

ECANCELED - Операція скасована

ECHILD - Немає дочірнього процесу

EDEADLK - Обхід тупика ресурсів

EDOM - Помилка області визначення

EEXIST - Файл існує

EFAULT - Неправильна адреса

EFBIG - Файл занадто великий

EINPROGRESS - Операція в процесі виконання

EINTR - Перерваний виклик функції

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

EIO - Помилка уведення-висновку

EISDIR - Це каталог

EMFILE - Занадто багато відкритих файлів

EMLINK - Занадто багато зв'язків

EMSGSIZE - Невизначена довжина буфера повідомлення

ENAMETOOLONG - Ім'я файлу занадто довге

ENFILE - Занадто багато відкритих файлів у системі

ENODEV - Немає такого пристрою

ENOENT - Немає такого файлу в каталозі

ENOEXEC - Помилка формату файлу, що виконується

ENOLCK - Блокування недоступне

ENOMEM - Недостатньо пам'яті

ENOSPC - Пам'яті на пристрої не залишилося

ENOSYS - Функція не реалізована

ENOTDIR - Це не каталог

ENOTEMPTY - Каталог непустий

ENOTSUP - Не підтримується

ENOTTY - Невизначена операція керування уведенням-

висновком

ENXIO - Немає такого пристрою або адреси

EPERM - Операція не дозволена

EPIPE - Зруйнований канал

ERANGE - Результат занадто великий

EROFS - Файлова система тільки на читання

ESPIPE - Неправільне позіціонування

ESRCH - Немає такого процесу

ETIMEDOUT - Операція затримана

EXDEV - Невизначений зв'язок

Приклад.

#include <errno.h> /* коди помилок */

extern int errno;

extern char *sys_errlist[];

int value;

…….

if((value = sys_call(...)) < 0 ){

printf("Error:%s(%d)\n",sys_errlist[errno],errno );

exit(errno); /*примусове завершення програми*/

}

sys_call(...)-деякий системний виклик

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]