Список предопределённых сигналов
Типы сигналов идентифицируются числовыми номерами, но при программировании часто используются символьные имена сигналов, определенные в системных включаемых файлах. Ниже приведены некоторые наиболее часто употребляемые имена сигналов:
SIGKILL - Этот сигнал приводит к завершению получившего его процесса. Это единственный сигнал, который не может игнорироваться и для которого нельзя назначить собственный обработчик
SIGTERM - Этот сигнал - запрос на завершение процесса. Выдачу этого сигнала, например, включает в себя команда (не системный вызов!) kill. Подразумевается, что процесс, получивший этот сигнал, должен завершиться, однако процесс может установить игнорирование этого сигнала или назначить для пего собственный обработчик.
SIGCHLD - Этот сигнал система посылает родительскому процессу при завершении любого его дочернего процесса. Реакция на этот сигнал, установленная по умолчанию, - игнорирование. Родительский процесс может не заботиться об обработке этого сигнала, если только он не хочет использовать его для синхронизации своего выполнения с дочерним процессом.
SIGALRM - Этот сигнал используется для отсчета временных интервалов. Процесс может установить некоторый временной интервал при помощи системных вызовов alarm () или setitimer (), и по истечении заданного интервала система пошлет ему сигнал SIGALRM.
SIGUSR1иSIGUSR2 - За этими сигналами являются зарезервированными, им не соответствуют никакие системные назначения. Процессы могут посылать эти сигналы друг другу и интерпретировать их по своему усмотрению.
Лабораторная работа №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() и в самом конце печатается фраза.
Лабораторная работа №7