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

UptoLike

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

43
flags – флаги. Существует только один флаг NAME_FLAG_ATTACH_GLOBAL – регист-
рировать глобальное имя. В противном случае имя регистрируется как локальное.
Вызов возвращает указатель к структуре name_attach, которая имеет вид:
typedef struct _name_attach {
dispatch_t* dpp; // dispatch-драйвер
int chid; // идентификатор канала
int mntid; // идентификатор монтирования
int zero[2]; // нулевые значения
} name_attach_t;
При выполнении функции создается канал посредством внутреннего
вызова ChannelCreate() с атрибутами: _NTO_CHF_UNBLOCK,
_NTO_CHF_DISCONNECT, _NTO_CHF_COID_DISCONNECT. В результате
сервер может получать сообщения и импульсы. Набор флагов устанавли-
вает, что сервер получит служебные импульсы при попытке деблокировки
клиента и при разрыве соединений. Ядро поддерживает взаимно-
однозначное соответствие между именем процесса и его программным
идентификатором (pid), поэтому именованный процесс не может иметь ко-
пий в оперативной памяти. На стороне клиента используется функция
name_open().
int name_open( const char * name, // имя сервера
int flags ); // флаги
Аргументы:
name – имя сервера, которое необходимо открыть;
flags – единственный используемый флаг NANE_FLAG_ATTACH_GLOBAL – искать гло-
бальное имя. При нулевом слове флаговискать локальное имя.
Эта функция открывает имя для серверного соединения, при этом ядро
с помощью вызова MsgSend() посылает серверу служебное сообщение
_IO_CONNECT с 4-байтовым заголовком. Серверное приложение должно
быть готовым принять это сообщение и ответить вызовом MsgReply(). При
удачном выполнении функции name_open() возвращается идентификатор
соединения (coid), а при неудачном значение –1.
3.5. Импульсы
При передаче сообщений с помощью вызова MsgSend() передающий
поток блокируется. Однако возможны ситуации, когда отправитель не мо-
жет позволить себе находиться в блокированном состоянии. Механизм, ко-
торый обеспечивает отправку коротких сообщений предопределенного
формата без блокирования отправителя, называют импульсным обменом.
Импульс (Pulse) – это миниатюрное сообщение, которое несет 40 бит по-
лезной информации: 8 бит кода (Pulse code) и 32 бит данных (Pulse value).
Посылающий поток задает приоритет импульса, импульсы с одинаковым
приоритетом ставятся в очередь. Импульс может быть принят функцией
MsgReceive() как и обычное синхронное сообщение, но более удобной яв-
ляется функция MsgReceivePulse(). При приеме импульса с помощью