lab5
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра вычислительной техники
Отчет по лабораторной работе №5
по дисциплине «Организация процессов и программирование в среде Linux»
Студент гр. |
|
Преподаватель |
Разумовский Г.В. |
Тема: Обработка сигналов
Цель работы: знакомство с механизмом сигналов и способами их обработки
Задание:
Написать программу, которая реагирует на ошибки при выполнении операции деления и неверном использовании указателя (деление на ноль, нарушение защиты памяти). При обнаружении ошибки программа должна передать управление функции, которая выведет сообщение и завершит работу программы с кодом ошибки (1 или 2). Тип ошибки, который должна зафиксировать программа, задается как параметр при ее запуске.
Откомпилировать программу и дважды запустить ее с разными
значениями типа ошибки.
Программа main.cpp
#include <signal.h>
#include <iostream>
using std::cout;
void division_by_zero_handler(int sig);
void segmentation_fault_handler(int sig);
int set_new_signals_handlers();
int main(int argc, char* argv[])
{
if(set_new_signals_handlers() < 0)
return EXIT_FAILURE;
if(argc != 2){
cout << "Ошибка набора параметров! Ожидалось: \"> ./main {num_error}\". \n";
return EXIT_FAILURE;
}
int error_expected = atoi(argv[1]);
if(error_expected == 1){
int zero_num = 0;
zero_num = 420 / (zero_num);
}
else if(error_expected == 2)
{
int* p = NULL;
cout << *p << std::endl;
}
else
{
cout << "Неверный ввод! Код ошибки должен быть либо 1, либо 2\n";
return EXIT_FAILURE;
}
return 0;
}
int set_new_signals_handlers()
{
if(signal(SIGFPE, division_by_zero_handler) == SIG_ERR)
{
perror("Сигнал SIGFPE: ");
return -1;
}
if(signal(SIGSEGV, segmentation_fault_handler) == SIG_ERR)
{
perror("Сигнал SIGSEGV: ");
return -1;
}
return 0;
}
void division_by_zero_handler(int sig)
{
cout << "SIGFPE=" << sig << " (арифметическая ошибка) обнаружена!\n";
cout << "Выход из программы с возвращением 1...\n";
exit(1);
}
void segmentation_fault_handler(int sig)
{
cout << "SIGSEGV=" << sig << " (нарушенние защиты памяти) обнаружено!\n";
cout << "Выход из программы с возвращением 2...\n";
exit(2);
}
Вывод программы
Санкт-Петербург
2022