
- •Лабораторная работа № 1 аргументы и опции программы. Функция getopt(). Знакомство с отладчиком gdb
- •Программа выполнения работы.
- •Отладчик gdb
- •Компиляция для отладки
- •Вход-выход
- •Команды gdb
- •Получение справки
- •Начало выполнения отлаживаемой программы
- •Настройки среды
- •Рабочий каталог отлаживаемой программы
- •Ввод и вывод отлаживаемой программы
- •Часто используемые команды
- •Варианты заданий
- •Контрольные вопросы.
- •Составить отчет
- •Варианты заданий.
- •Контрольные вопросы
- •Лабораторная работа № 3 ввод/вывод в linux. Обработка ошибок
- •Программа работы
- •Составить отчет Краткая теория.
- •Системные вызовы
- •Обработка ошибок.
- •Варианты заданий
- •Варианты:
- •Контрольные вопросы
- •Составить отчет.
- •Варианты заданий
- •Составить отчет.
- •Варианты заданий.
- •Составить отчет. Краткая теория.
- •Создание и удаление каталогов
- •Чтение каталогов
- •Варианты заданий.
- •Контрольные вопросы.
Обработка ошибок.
Проверка ошибок после работы системного вызова является необходимым условием написания хороших программ. Чтобы использовать средства обработки ошибок программа должна включить заголовочный файл "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…)