Теоретические сведения.
Критической секцией называют такой участок кода, при вхождении в который процесс не может быть прерван. Существуют стандартные обработчики прерываний, созданные разработчиками системы. Вы можете создавать свои собственные обработчики прерываний и заменять ими стандартные. Примеры программ с использованием обработчиков прерываний.
Текст программы 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 Все права принадлежат авторам размещенных материалов.
|