Список предопределённых сигналов

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

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

Наши рекомендации