Существует две формы взаимодействия процессов:
- передача данных между процессами (коммуникация)
- синхронизация одного или нескольких процессов друг с другом
Часто эти формы сочетаются. Например, один процесс нуждается в данных, которые подготавливаются другим процессом и должен дожидаться, когда они будут готовы.
На обработчик прерываний часто возлагается обязанность активизировать приостановленный процесс, ожидающий реакции из внешней среды.
Характерной особенностью сигнала является его близость с понятием прерывания.
Сигналом называется короткое сообщение (код сигнала), посланное от одного процесса другому, вызывающее асинхронное выполнение процесса-адресата как реакцию на сигнал, с восстановлением прерванного хода процесса по окончании обработки сигнала.
OS-9 для своих целей использует сигналы с порядковыми номерами от 0 до 255. Действие посылаемого сигнала на процесс-адресат состоит в следующем:
- Если процесс не был активен, то он становится в очередь активных процессов в соответствии с установленным режимом диспетчеризации.
- Когда процесс, будучи текущим процессом, окажется в состоянии пользователя, запускается особая часть процесса, называемая обработчиком сигналов, а после завершения обработчиком сигналов своих функций выполнение процесса продолжается как до поступления сигнала.
- Если при получении сигнала процесс был остановлен или находился в состоянии ожидания, то после завершения обработки сигналов, выполнение процесса начинается с команды следующей за системным вызовом, переводящим процесс в приостановленное состояние или в состояние ожидания. Если процесс-адресат в момент прихода сигнала выполнял какой-нибудь системный вызов, то обработчик сигналов не вызывается до тех пор, пока ядро не закончит выполнение этого вызова. Однако если при выполнении системного вызова процесс оказался в приостановленном состоянии, например, в драйвере устройства, ожидая прерывание, то он активизируется и продолжает выполнение с точки, следующей за системным вызовом приостановки. Это позволяет выводить процесс из любого состояния остановки или ожидания.
Сигналы способны выстраиваться в очередь к процессу и обслуживаться им в порядке приоритета. Также возможно маскирование сигнала со стороны процесса.
Процедура обработки сигнала определяется как функция
Disp (Signal)
int signal
{
.
.
.
}
При запуске обработчика сигнала ядро прерывает выполнение основной части прикладного процесса и инициализирует её продолжение после завершения выполнения её обработчика. Для того, чтобы эта функция распознавалась, она должна быть установлена прикладным процессом с помощью системной функции intercept(Disp).
После чего функция будет получать управление (запускаться ядром) каждый раз при появлении нового сигнала. Причем через параметр signal ей будет передаваться значение этого сигнала.