Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие_Unix.doc
Скачиваний:
4
Добавлен:
26.11.2019
Размер:
2.41 Mб
Скачать

3.6.2 Взаимодействие родственных процессов

Каналы

Каналы используются для передачи данных от одного процесса к другому.

С точки зрения программы, канал есть некая сущность, обладающая двумя файловыми дескрипторами. Через один ФД процесс может писать информацию в канал, через другой ФД процесс может читать информацию из канала.

Каналы могут быть использованы только для обмена данными между родственными процессами и недоступны для независимых процессов.

Особенности работы с каналом. Под хранение информации, передаваемой через канал, выделяется некоторый фиксированный объем оперативной памяти. Если буфер переполнен или в буфере нет еще данных, процесс приостанавливается и ждет, пока не освободится место, либо пока в канале не появится информация. В этих случаях работа процесса может изменяться в зависимости от установленных параметров, которые можно менять программно.

Рисунок 3.9 - Использование канала

Процесс, создающий канал, использует системный вызов pipe(), который возвращает значения файловых дескрипторов для чтения и записи в канал. Этот процесс и его дочерние процессы наследуют и разделяют назначенные файловые дескрипторы. Канал организуется при помощи конвейеров оболочки.

Ls / | more (оба процесса созданы процессом shell и являются родственными)

Сигналы

Система имеет фиксированный набор событий, которые могут возникать. Каждое событие имеет свое уникальное имя. Такие имена называются сигналами.

Есть сигналы, которые присутствуют практически во всех UNIX, но есть сигналы, специфичные для конкретной версии UNIX

Сигналы – простейшая форма взаимодействия процессов. Сигналы генерируются ядром и позволяют уведомить процесс или группу процессов о наступлении какого-либо события.

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

Сигналы могут посылаться

  1. от одного процесса другому как средство межзадачного взаимодействия.

  2. драйвером терминала (консоли), например, для уничтожения процесса по нажатию клавиш Control+C.

  3. Ядро может посылать сигналы, если процесс выполняет недопустимую инструкцию, например, деление на ноль.

  4. пользователь с помощью команды kill.

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

3.6.3 Взаимодействие произвольных процессов

В UNIX есть набор средств, поддерживающих взаимодействие произвольных процессов. Одно из таких средств - Система Межпроцессного Взаимодействия IPC (InterProcess Communications). Суть этой системы заключается в следующем.

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

  1. Именование;

  2. Синхронизация;

1. Для неименованных каналов, за счет того, что они передавались по родственному наследованию, всегда в процессе были известны дескрипторы, ассоциированные с каналом.

Проблема именования в системе IPC решается за счет ассоциирования с каждым ресурсом некоторого ключа. В общем случае это целочисленное значение. Для того, чтобы не было коллизии ключей, в системе предусмотрено стандартное средство генерации уникальных ключей. При создании разделяемого ресурса его автор приписывает ему номер и определяет права доступа к этому ресурсу. После этого любой процесс, который укажет системе, что он хочет общаться с разделяемым ресурсом с ключом N, и обладает необходимыми правами доступа, будет допущен для работы с этим ресурсом.

2. Проблема синхронизации доступа - как организовать обмен с ресурсами, чтобы этот обмен был корректным. Если у нас есть, например, ресурс “оперативная память”, то когда один процесс еще не дописал информацию, а другой процесс уже прочитал весь блок, то возникает некорректная ситуация.

Система IPC поддерживает три разновидности разделяемых ресурсов:

  1. Разделяемая память.

  2. Передача сообщений.

  3. Семафоры.