Добавил:
Кафедра ВТ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab5

.docx
Скачиваний:
13
Добавлен:
02.01.2023
Размер:
129.47 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра вычислительной техники

Отчет по лабораторной работе №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

Соседние файлы в предмете Программирование в среде Linux