Здавалка
Главная | Обратная связь

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



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

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

 

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

/*‘$cat critical.с'*/

#include <stdio.h>

#include <signal.h>

 

main()

{

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

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

sleep(3);

oldHandler=signal(SIGINT,SIG_IGN);

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

signal(SIGINT, oldHandler);

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

sleep(3);

printf("bye\n");

}

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

'$critical'

I can be <ctrl>+<c>

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

I can be <ctrl>+<c> again

bye

Описание работы программы 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() и в самом конце печатается фраза.

Лабораторная работа №7

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

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

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

Как известно, семафор представляет собой неотрицательную целую неделимую переменную, над которой возможны только два вида операций: Р (операция уменьшения значения семафора на 1) и V (операция увеличения значения семафора на 1).

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







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.