Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 42 стр.

UptoLike

Составители: 

42
3.4. Локализация сервера синхронного канала
Для того чтобы передать сообщение от клиента к серверу, клиентский
поток должен создать соединение с каналом сервера, а для этого ему не-
обходимо знать номер канала, созданного сервером. Когда передающий и
принимающий потоки находятся в одном процессе, эта задача не представ-
ляет особого труда: достаточно объявить номер канала как глобальную пе-
ременную процесса, и она будет доступна всем процессам в потоке. Ситуа-
ция резко усложняется, когда потоки находятся в разных не связанных ме-
жду собой процессах. Существует несколько способов передать номер ка-
нала и/или непосредственно образовать соединение с каналом. Наиболее
радикальный способпостроить серверный процесс по канонам админист-
ратора ресурсов. В этом случае администратор регистрирует некоторую
область полномочий в пространстве имен, и номер соединения может быть
получен при выполнении стандартной библиотечной функции open(). При
вызове этой функции в качестве аргумента указывается имя из зарегистри-
рованной области полномочий. Разработка администратора ресурсов в
полном объемесложная задача и имеет смысл только для достаточно
больших приложений. Далее будет рассмотрена более простая альтерна-
тива, основанная на регистрации имен процессов (так называемый непол-
ный администратор).
Для работы с именами процессов используются системные вызовы,
представленные в табл. 3.5.
Таблица 3.5
Функция Описание
name_attach() Регистрировать имя процесса и создать канал
name_open() Локализовать сервер и получить идентификатор соединения
name_close() Уничтожить соединение с каналом сервера
name_detach() Удалить имя процесса из пространства имен и созданный канал
Процесс сервера, который желает получать сообщения, регистрирует
символическое имя. С этой целью используется системный вызов
name_attach().
name_attach_t * name_attach( dispatch_t * dpp, // dispatch-драйвер
const char * path, // имя процесса
unsigned flags ); // флаги
Аргументы:
dpp – указывает на функцию dispatch-драйвер, но обычно имеет значение NULL, в этом
случае необходимые структуры и функции строятся автоматически;
path – имя процесса, которое необходимо зарегистрировать. Список локальных зареги-
стрированных имен процессов можно посмотреть в директории ./dev/name/local, список гло-
бальных зарегистрированных имен доступен в директории ./dev/name/global. Локальные имена
известны в пределах одного узла, а глобальныев пределах всей сети;