Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OS.DOC
Скачиваний:
18
Добавлен:
28.10.2018
Размер:
653.82 Кб
Скачать
  1. Межпроцессные коммуникации unix

Если задуматься над вопросом, что в наши дни является ключевой компонентой в области передовых компьютерных технологий, то без сомнения можно было бы ответить, что такой технологией в наши дни является технология «клиент – сервер». Эта универсальная модель служит основой построения любых сколь угодно сложных систем, в том числе и сетевых.

Разработчики СУБД, коммуникационных систем, систем электронной почты, банковских систем и т. д. но всем мире используют эту технологию. В этом смысле ОС UNIX является для разработчиков системного и прикладного программного обеспечения почти идеальным средством, потому что в своей основе наиболее полно отвечает требованиям технологии «клиент – сервер».

Для построения моделей типа «клиент – сервер» UNIX существуют специальные средства:

• сигналы;

• семафоры;

• программные каналы;

• очереди сообщений;

• разделяемая память;

• специальные команды (write, cu, mail);

• средства межмашинного взаимодействия (uucp, tcp/ip, nfs, rfs,).

В первоначальных версиях UNIX в момент ее зарождения этих средств либо вообще не существовало, либо они существовали в зачаточном состоянии. Но сейчас, особенно после появления System V, эти средства все более развиваются.

Рассмотрим некоторые из этих средств более подробно.

    1. Сигналы

Если рассматривать процесс как некую виртуальную машину, то в такой системе должна быть система прерываний, отвечающая стандартным требованиям:

• обработка исключительных ситуаций;

• средства обработки внешних и внутренних прерываний;

• средства управления системой прерываний (маскирование и демаскирование).

Всем этим требованиям в UNIX отвечает система сигналов, которая может не только воспринимать и обрабатывать сигналы, но и порождать их, и посылать на другие машины (процессы).

Сигналы могут быть синхронными, когда инициатор сигнала - сам процесс, и асинхронными, когда инициатор возникновения сигнала - интерактивный пользователь за терминалом. Источником асинхронных сигналов может быть также ядро, когда оно контролирует определенные состояния аппаратуры, рассматриваемые как ошибочные.

Для удобства использования каждый сигнал закодирован и цифровсн значение сигнала с применением мнемонической формы записи хранится ) файле <signal.h>.

Всего в UNIX 20 сигналов. Как правило, реакцией на сигнал (по умолчанию) является окончание процесса, принявшего сигнал (закончить процесс). Исключение составляют два процесса: со значением сигнала (18) – SIGCLD, который вырабатывается, когда заканчивается порожденный процесс и идет к породившему процессу (реакцией является сброс сигнала), и процесс со значением сигнала (19) -SIGPVR, вырабатываемый при уменьшении напряжения сети. В зависимости от реализации этот сигнал посылается разным процессам. Реакция на этот сигнал также вырабатывается в зависимости от реализации.

Реакцией на все остальные сигналы является завершение процесса, принявшего сигнал.

Сигналы unix по мере возрастания их значений:

SIGHUP (1) - Вырабатывается при отключении свя­зи с терминалом. Рассылается всем процессам TGID.

SIGINT (2) - При нажатии определенной клавиши. Рассылается всем процессам TGID.

SIGQUIT (3) - При нажатии клавиши QUIT. Рассылается всем процессам TGID.

SIGILL (4) - При возникновении аппаратных неконтролируемых состояний. Текущему PID.

SIGTRAP (5) - При трассировке. Текущему PID.

SIGIOT (6) - При неисправности в аппаратуре. Текущему PID.

SIGTEMT (7) - При выполнении команды ЕМТ. Текущему PID.

SIGFPE (8) - При обработке чисел с плавающей точкой. Текущему PID.

SIGKILL (9) – При выдаче системного вызова kill. Адресуемому PID.

SIGBUS (10) - При ошибке в косвенной адресации. Текущему PID.

SIGSEGV (11) - При выходе за пределы сегмента. Текущему PID.

SIGSYS (12) - При неверном системном вызове. Текущему PID.

SIGPIPE (13) - При записи в Pipe, когда нет читающего процесса. Текущему PID записи в канал.

SIGALARM (14) - При окончании временной установки. Посылается к PID установки.

SIGTERM (15) - При выполнении команды kill в командном режиме. Посылается к адресуемому PID.

SIGUSR1 (16) - При системном вызове kill. Посылается к адресуемому PID.

SIGUSR2 (17) – аналогично (16)

SIGCLD (18) - Когда заканчивается "процесс-сын".Идет к "процессу-отцу".

SIGPWR (19) - При уменьшении напряжения сети. Идет в зависимости от реализации.

SIGPOOL (20) - При регистрации события в Stream-устройстве. К процессу, работающему с потоком.

Средством посылки и восприятия сигналов в ОС UNIX служат два системных вызова - kill и signal. Системный вызов kill посылает выбранному процессу сигнал с определённым номером:

int kill (int pid, int sig);

Системный вызов signal воспринимает и идентифицирует сигнал:

#include <signal.h>

int (* signal (int sig, void (* func (int))) (int));

Возможности системного вызова signal позволяют обрабатывать сигналы следующими тремя способами:

1. Реакция по умолчанию.

2. Замаскировать сигнал (т. е. проигнорировать его). Для указания возможности маскирования второму аргументу присваивается специальное значение SIG_IGN. Можно, например, проверить, было ли ранее установлено маскирование в отношении сигнала SIGINT, и если не было, то установить такое маскирование:

#include <signal.n>

……………………………………… (текст)

if (signal (SIGINT,SIG_IGN)!=SIG_IGN)

signal (SIGINT,SIG_IGN);

3. Перехватить посланный процессу сигнал и написать собственную программу обработки прерывания по асинхронно посланному сигналу.

Например: элементарная программа печати файлов воспринимает сигнал прерывания (клавиша DEL, посланная оператором) и, приостановив свoe выполнение, спрашивает, действительно ли нужно прервать печать файла. С помощью механизма сигналов это может быть реализовано в виде небольшой программы.

Используя технику сигналов, можно решать самые разнообразные задачи, в том числе можно даже предотвратить такую неприятную особенность, как появление в системе "процессов-зомби".

В UNIX System V имеется средство, построенное на использовании сигнала SIGCLD: signal (SIGCLD,SIG_IGN).

Такой вызов говорит ядру, что далее «процесс-отец» не обязан знать о судьбе своих «сыновей», поэтому ядро будет само заканчивать процессы по exit или другим способом и «зомби» поэтому появляться не будут. В UNIX 4.3 BSD такого средства нет.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]