Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Обработка ошибок.

Читайте также:
  1. VII. Обработка звука. Редактор звука Adobe Audition.
  2. Вторичная термообработка автомобильных деталей
  3. Выполнение результатов и обработка результатов
  4. Дискретное представление информации: кодирование цветного изображения в компьютере (растровый подход). Представление и обработка звука и видеоизображения.
  5. Изучение пунктуации в школе. Пунктограмма и пунктуационное правило. Работа над интонацией. Упражнения по пунктуации. Виды пунктуационных ошибок. Методика пунктуационного разбора.
  6. Лекция 12. Санитарная обработка. Эвакуация населения и имущества.
  7. Логические законы в риторике. Основные требования к аргументации в речи юриста и причины логических ошибок.
  8. Машинная автоматическая обработка пленок
  9. Межъязыковая и внутриязыковая интерференция и типология грамматических ошибок. Формы контроля уровня сформированности грамматических навыков. Система грамматических упражнений.
  10. Место в севообороте, обработка почвы и удобрение ранних яровых культур.

Проверка ошибок после работы системного вызова является необходимым условием написания хороших программ. Чтобы использовать средства обработки ошибок программа должна включить заголовочный файл "errno.h".

Знания о том, что произошла ошибка – мало. Нужно знать ее причину. Для этого у процесса есть специальная предопределенная переменная errno. Всякий раз, когда системный вызов завершается с ошибкой, errno устанавливается в одно из значений из набора предопределенных значений ошибок, которые определены в <errno.h>. Стандарт POSIX 2001 определяет большое число возможных ошибок, большинство из которых относится к сетям, межпроцессному. В man для каждого системного вызова описаны возможные значения errno, которые могут иметь место. Возможные значения определены через зарезервированные (операционной системой) символические имена. Имена начинаются с "E", содержат символы верхнего регистра или цифры.

Начальное значение errno при запуске программы равно 0. Переменную errno следует проверять лишь после того, как возникла ошибка и до того, как сделаны дальнейшие системные (или библиотечные) вызовы. Успешный системный вызов не восстанавливает errno в 0.

Функция perror(3) печатает сообщение об ошибках в поток stderr. Она выводит представленную в параметрах строку message, за которой следует двоеточие и пробел, а строка, описывающая значение errno:

 

include <stdio.h>

void perror (const char * message)

 

Более современная функция вывода сообщений об ошибке ‑ strerror(3), которая возвращает указатель на строку, соответствующую номеру ошибки, заданному параметром errnum:

include <string.h>

сhar * strerror (int errnum) (функция);

значение errnum обычно исходит из переменной errno.

Не следует изменять строку, возвращаемую strerror. Также, если в программе осуществляются последующие обращения к strerror(3), новая строка будет записана поверх старой. (Но гарантируется, что никакая библиотечная функция не вызовет strerror за вашей спиной.).

Пример. Использование fprintf для вывода сообщения об ошибке:

 

if (some_system_call(param1, param2)<0)

{ fprintf(stderr,” %s: %d, %d: some_system_callfailed: %s\n”,

argv[0], param1, param2, strerror(errno));

return 1;

}

 

Обе функции strerror(3) и perror(3) производят одно и то же сообщение для любого данного кода ошибки; точный текст изменяется от системы к системе. На системе GNU, сообщения довольно коротки; не имеются никаких многострочных сообщений или вложенных символов перевода строки. Каждое сообщение об ошибках начинается заголовочной буквой и не включает никакой пунктуации завершения.

Варианты заданий

Программа должна начинаться с выдачи заголовка с информацией об авторе (ФИО, курс, группа. № зачетки). В программе следует выполнить обработку ошибок после каждого системного вызова. Размер блока для операций ввода/вывода следует выбрать кратным хх – последние цифры зачетки (если xx=0, то xx=50).

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

Написать программу, которая копирует файл, имя которого задается в первом аргументе, в файл с именем во втором аргументе. Третий аргумент определяет права доступа (использовать символические имена S_I…)

Варианты:

1. Для создания использовать системный вызов open(2);

- права доступа: 760

- ошибки:

- открывает для чтения несуществующий файл;

- открывает для записи существующий файл, который удалять нельзя;

- при чтении аргумент fildes является некорректным (искусственно его следует испортить или ввести с клавиатуры не верное значение);

2. Для создания использовать системный вызов creat(2);

- права доступа: 744

- ошибки:

- открывает для чтения файл, не имея права доступа на чтение;

- открывает для записи файл, у которого в имени присутствует элемент, не являющийся каталогом;

- при записи аргумент fildes является не корректным (искусственно его следует испортить или ввести с клавиатуры не верное значение);

3. Для создания использовать системный вызов open(2);

- права доступа: 666

- ошибки:

- открывает для чтения файл, который является каталогом (при исправлении ввести корректное имя файла);

- открывает для записи уже существующий файл, который удалять нельзя;

- при закрытии аргумент fildes является не корректным (искусственно его следует испортить или ввести с клавиатуры не верное значение);

4. Для создания использовать системный вызов creat(2);

- права доступа: 740

- ошибки:

- открывает для чтения файл, к которому не имеет доступа;

- открывает для записи уже существующий файл, который удалять нельзя;

- при закрытии аргумент fildes является не корректным (искусственно его следует испортить или ввести с клавиатуры не верное значение);

5. Для создания использовать системный вызов open(2);

- права доступа: 777

- ошибки:

- открывает для чтения файл, к которому не имеет доступа;

- открывает для записи файл, к которому не имеет доступа

- при записи происходит превышение допустимого размера файлов [реализуйте многократное копирование и см. ulimit(2)].

6. Для создания использовать системный вызов creat(2);

- права доступа: 644

- ошибки:

- открывает для чтения несуществующий файл;

- открывает для записи уже существующий файл, который удалять нельзя;

- при записи происходит превышение допустимого размера файлов [реализуйте многократное копирование и см. ulimit(2)].

Контрольные вопросы

1. По каким причинам могут возникать ошибки в программах (перечислите не менее 5 причин)?

2. Как определить, что в программе произошла ошибка? Как определить, какая именно ошибка имеет место?

3. Что такое дескриптор файла? Для чего он нужен операционной системе?

4. Какие дескрипторы зарезервированы в UNIX и для чего?

5. В каком случае число, возвращаемое функцией read (2) будет меньше запрошенного? Почему эту ситуацию необходимо отслеживать в программе?

6. В каком случае число, возвращаемое функцией write (2) будет меньше запрошенного? Почему эту ситуацию необходимо отслеживать в программе?

7. Почему при копировании файлов с помощью read (2) и write (2) следует проверять значения, возвращаемые этими функциями на равенство?

 




Дата добавления: 2014-12-15; просмотров: 94 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.013 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав