Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

8.3. Дополнительные средства межпроцессного взаимодействия

8.3.1. Введение и основные понятия

ОС UNIX предлагает множество дополнительных механизмов межпроцессного взаимодействия. Их наличие дает UNIX богатые возможности в области связи между процессами и позволяет разработчику использовать различные подходы при программировании многозадачных систем. Дополнительные средства межпроцессного взаимодействия, которые будут рассмотрены, можно разбить на следующие категории:

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

  • семафоры;

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

Эти средства широко применяются и ведут свое начало от системы UNIX System V, поэтому их иногда называют IPC System V. Следует заметить, что вышеназванные дополнительные средства были определены в последних версиях стандарта POSIX.1

Ключи средств межпроцессного взаимодействия

Программный интерфейс всех трех средств IPC System V однороден, что отражает схожесть их реализации в ядре. Наиболее важным из общих свойств является ключ (key). Ключи – это числа, обозначающие объект межпроцессного взаимодействия в системе UNIX примерно так же, как имя файла обозначает файл. Другими словами, ключ позволяет ресурсу межпроцессного взаимодействия совместно использоваться несколькими процессами. Обозначаемый ключом объект может быть очередью сообщения, набором семафоров или сегментом разделяемой памяти. Ключ имеет тип TKey, состав которого зависит от реализации и определяется в файле ipc.

Ключи не являются именами файлов и несут меньший смысл. Они должны выбираться осторожно во избежание конфликта между различными программами, в этом помогает применение дополнительной опции – «версии проекта». (Одна известная система управления базами данных использовала для ключа шестнадцатеричное значение типа 0xDB; плохое решение, так как такое же значение мог выбрать и другой разработчик.) В ОС UNIX существует простая библиотечная функция ftok, которая образует ключ по указанному файлу.

Описание

uses ipc;

Function ftok(Path:String; ID:char):TKey;

Эта процедура возвращает номер ключа на основе информации, связанной с файлом path. Параметр id также учитывается и обеспечивает еще один уровень уникальности – «версию проекта»; другими словами, для одного имени path будут получены разные ключи при разных значениях id. Процедура ftok не слишком удобна: например, если удалить файл, а затем создать другой с таким же именем, то возвращаемый после этого ключ будет другим. Она завершится неудачей и вернет значение -1 и в случае, если файл path не существует. Процедуру ftok можно применять в приложениях, использующих функции межпроцессного взаимодействия для работы с определенными файлами или при применении для генерации ключа файла, являющегося постоянной и неотъемлемой частью приложения.

Операция get

Программа применяет ключ для создания объекта межпроцессного взаимодействия или получения доступа к существующему объекту. Обе операции вызываются при помощи операции get. Результатом операции get является его целочисленный идентификатор (facility identifier), который может использоваться при вызовах других процедур межпроцессного взаимодействия. Если продолжить аналогию с именами файлов, то операция get похожа на вызов fdcreat или fdopen, а идентификатор средства межпроцессного взаимодействия ведет себя подобно дескриптору файла. В действительности, в отличие от дескрипторов файла, идентификатор средства межпроцессного взаимодействия является уникальным. Различные процессы будут использовать одно и то же значение идентификатора для объекта межпроцессного взаимодействия.

В качестве примера рассмотрим вызов msgget для создания новой очереди сообщений (что представляет собой очередь сообщений, обсудим позже):

mqid := msgget(octal(0100), octal(0644) or IPC_CREAT or IPC_EXCL);

Первый аргумент вызова, msgget, является ключом очереди сообщений. В случае успеха процедура вернет неотрицательное значение в переменной mqid, которая служит идентификатором очереди сообщений. Соответствующие вызовы для семафоров и объектов разделяемой памяти называются соответственно semget и shmget.

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal