Загрузил evgeniy.osipenko.88

Отчет по лабораторной работе №4: Обработка сигналов

Министерство науки и высшего образования РФ
Федеральное государственное бюджетное образовательное учреждение
высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра компьютерных систем в управлении и проектировании (КСУП)
ОТЧЁТ
Лабораторная работа №4
по дисциплине: «Вычислительные машины, системы и сети»
тема: «Обработка сигналов»
Выполнил студент: Осипенко Евгений Эдуардович
Специальность 27.03.04
Управление в технических системах
2021 г.
СОДЕРЖАНИЕ
1. Цель работы…………………………………………………………………………......3
2. Задание…………………………………………………………………………………….3
3. Выполнение задания…………………………………………………………………….3
4. Заключение………………………………………………………………………………7
1. Цель работы
Целью выполнения настоящей лабораторной работы является получение
навыков программного управления процессами с помощью сигналов.
2. Задание
4. Процесс-отец порождает четыре дочерних процесса, каждый из которых выполняет
бесконечный цикл. При этом каждый из дочерних процессов особым образом
реагирует на сигнал SIGINT:
 процесс 1 обрабатывает сигнал SIG INT в бесконечном цикле, выдавая свое
сообщение на экран, добавляя к нему текущую дату. Данный цикл защищен от
воздействия сигнала SIGQUIT;
 процесс 2 при получении сигнала SIGINT выводит сообщение на экран и
продолжается;
 вся программа процесса 3 защищена от воздействия сигнала SIGINT;
 перед входом процесса 4 в бесконечный цикл для него меняется идентификатор
сеанса.
Сразу после порождения дочерних процессов процесс-отец завершается.
Далее следует проверить реакцию оставшихся процессов на сигналы SIGINT и
SIGQUIT.
3. Выполнение задания
1. Создадим файл с текстом программы командой cat>proc.c и введем следующий
текст:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int pid, childs;
//Обработчик сигнала SIGINT всех процессов
void sig_int(int sig)
{
switch (childs)
{
case 1:
const time_t tm = time(NULL);
char buf[64];
strftime(buf, sizeof(buf), "%d.%m.%Y", localtime(&tm));
printf("Процесс 1 продолжает работу %s\n", buf);
break;
case 2:
printf("Процесс 2 продолжает работу...\n");
break;
case 4:
exit(1);
}
}
void child(int childid)
{
printf("Child %d %d\n", childs, getpid());
switch (childid)
{
case 1:
//Игнорируем сигнал SIQUIT для процесса 1
if (signal(SIGQUIT, SIG_IGN) == SIG_ERR) {
printf("Ошибка обработчика сигнала\n");
exit(1);
}
break;
case 3:
//Игнорируем сигнал SIGINT для процесса 3
if (signal(SIGINT, SIG_IGN) == SIG_ERR) {
printf("Ошибка обработчика сигнала\n");
exit(1);
}
break;
case 4:
//Изменяем идентификатор сеанса для процесса 4
printf("Процесс 4: исходный идентификатор сеанса %d\n", getsid(0));
printf("Процесс 4: новый идентификатор сеанса %d\n", setsid());
break;
}
//Бесконечный цикл
while (1) {};
exit(1);
}
int main ()
{
printf("Процесс-отец: %d\n", getpid());
//Установим обработчик сигнала SIGINT
if (signal(SIGINT, sig_int) == SIG_ERR) {
printf("Ошибка обработчика сигнала\n");
exit(1);
}
//Создадим 4 потомка
for (childs = 1; childs <= 4; childs++) {
pid = fork();
switch (pid)
{
case -1:
printf("Ошибка порождения дочернего процесса\n");
exit(1);
case 0:
child(childs);
}
}
if (childs == 4) {
printf("Процесс-отец: %d породил 4 дочерних процесса и завершается\n",
getpid());
}
}
2. Выполним компиляцию созданного файла proc.c командой: gcc proc.c -o proc, далее
запустим созданную программу командой: ./ proc:
Скриншот запуска
4. Заключение
В ходе выполнения лабораторной работы мною были получены навыки программного
управления процессами с помощью сигналов.