Главная страница

Лабораторная работа Обработка сигналов Цель работы


Скачать 227.12 Kb.
НазваниеЛабораторная работа Обработка сигналов Цель работы
Дата17.01.2022
Размер227.12 Kb.
Формат файлаdocx
Имя файлаReport4.docx
ТипЛабораторная работа
#333497

Лабораторная работа № 4. Обработка сигналов

Цель работы

Целью выполнения настоящей лабораторной работы является получение навыков программного управления процессами с помощью сигналов.

Задача

Процесс-отец открывает существующий текстовый файл, а затем порождает два дочерних процесса, которые по очереди выводят содержимое этого файла фиксированными порциями по 15 символов, предваряя каждый вывод номером своего процесса. Вывод на экран заканчивается или при достижении середины файла, или по истечении интервала времени в 5 секунд.

Ход работы

  1. Создадим файлы, с которыми будем работать.



  1. Файл test.txt будет довольно большим, чтобы программа не успела его обработать до середины и выполнение завершилось через пять секунд.



  1. Файл test2.txt будет небольшим, чтобы программа не могла выполняться более 5 секунд и обработала только первую половину файла.



  1. В данном случае создадим только два процесса, хотя это значение может быть и другим.

#include

#include

#include

#include

#include

#include

#define PROC_COUNT 2

int pid, np;

void sig_handler (int sig)

{

if (sig == SIGUSR1) if (np == PROC_COUNT) {

sleep(1);

kill (pid, SIGUSR1);

}

}

int main (int ac, char *av[])

{

int fd = open (av[1], O_RDONLY);

if (fd == -1) err (1, "Open file");

if (signal (SIGUSR1, sig_handler) == SIG_ERR) err (1, "Set Signal Handler");

int prev_pid = getpid();

for (np=0; np < PROC_COUNT; np++) {

pid = fork();

if (!pid) break;

prev_pid = pid;

}

if (np == PROC_COUNT) {

sleep(1);

kill (pid, SIGUSR1);

for (int i= 0; i
close (fd);

return 0;

}

time_t endwait;

time_t start = time(NULL);

time_t seconds = 5;

endwait = start + seconds;

char buf[21];

for (int i=0; start < endwait; i++) {

pause();

int file_size = lseek(fd, 0, SEEK_END);

int current_offset = i*15*PROC_COUNT + (PROC_COUNT-np-1)*15;

if (file_size/2 - current_offset <= 0) break;

if (lseek (fd, current_offset, SEEK_SET) < 0) break;

int size = read (fd, buf, 15);

if (size<1) break;

buf[size]= 0;

printf ("proc %d: %s\n", getpid(), buf);

fflush (stdout);

kill (prev_pid, SIGUSR1);

start = time(NULL);

}

kill (prev_pid, SIGUSR1);

return 0;

}

  1. Протестируем программу на большом файле.



  1. Протестируем программу на небольшом файле.



Заключение

В ходе данной лабораторной работы были получены навыки программного управления процессами с помощью сигналов и разработана соответствующая программа на языке Си.



написать администратору сайта