Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СРВ_метода_финальная.doc
Скачиваний:
12
Добавлен:
10.11.2019
Размер:
322.56 Кб
Скачать

Лабораторная работа №5 Тема: Сигналы для межпроцессного взаимодействия. Сигнальные часы (таймеры).

Цель работы: овладеть навыками использования сигналов для межпроцессного взаимодействия, ознакомиться с использованием таймеров.

Теоретические сведения.

Сигналы могут использоваться как средство межпроцессного взаимодействия. Примеры программ.

Текст программы alarm.с:

'$cat alarm. с'

main()

{alarm(3); //заведен будильник на 3 сек

printf("Looping forever\n”);

whiie(1);

printf("This line should never be executed\n”):

}

Выполнение программы alarm.e:

'$alarm'

Looping forever

Alarm clock

Описание работы программы aiarm.e:

Системным вызовом alarm() заводится будильник на 3 секунды. Далее печатается текст "Looping forever'". Далее начинается бесконечный цикл, поэтому текст не будет напечатан. Как только проходит 3 секунды, ставится отметка о будильнике текстом "Alarm clock". а1аrm(<время>) сигнал тревоги, посылаемый процессу, который выполняется в режиме задачи.

Лабораторная работа №6 Тема: Синхронизация процессов. Защита критического кода и формирование цепочки обработчиков прерываний.

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

Теоретические сведения.

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

Примеры программ с использованием обработчиков прерываний.

Текст программы critical.c:

‘$cat critical.с'#inciude <stdio.h>

#include <signal.h>

main()

{void (*oldHandler)(); //the index on function appears

printf(‘I can be <ctrl>+<c>\n");

sleep(3);

oldHandler=signal(S!GINT,S!GJGN);

printf('Tm protected from <ctrl>+<c> now\n"); sleep(3);

signal(SIGINT, oldHandler);

printf("l can be <ctrl>+<c> again\n");

sieep(3);

printf("bye");}

'Scritical'

I can be <ctrl>+<c>

I'm protected from <ctrl>+<c> now

Описание работы программы critical.c:

В программе происходит блокировка стандартного сигнала на другой (можно сделать и свой обработчик, будет свой сигнал). То есть происходит смена сигнала SIGINT на SIG_IGN.

SIGINT - сигнальное прерывание.

Signal(<номер сигнала, при получении которого будет выполнено действие, связанное с запуском пользовательской функции>,<адрес функции>) - системный вызов сигнала.

Текст программы handler.c:

‘$cat handler.c'

#include <stdio.h>

#include <signal.h>

int alarmFlag = 0;

void alarmHandler();

main ()

{signal(SIGALRM, alarmHandler);

alarm(3);

printf("Looping\n");

while(!alarmFlag)

{pause();

}

printf("Loop ends due to alarm signal\n");

}

void alarmHandler()

{printf("An alarm clock signal was received\n");

alarmFlag=1;

}

Выполнение программы handler.c:

Looping

An alarm clock signal was received

Loop ends due to alarm signal

Работа программы handler.c:

При использовании функции signal() используется написанная функция alarmHandler(), которая печатает строку и повышает флаг (индекс) на 1. Программа выполняется следующим образом: написана функция signal(), далее ставится будильник на 3 секунды, поэтому успевает напечататься текст и выполнится функция alarmHandler() и в самом конце печатается фраза.