Операционная система UNIX


Очереди сообщений


Для обеспечения возможности обмена сообщениями между процессами этот механизм поддерживается следующими системными вызовами:

  • msgget для образования новой очереди сообщений или получения дескриптора существующей очереди;
  • msgsnd для посылки сообщения (вернее, для его постановки в указанную очередь сообщений);
  • msgrcv для приема сообщения (вернее, для выборки сообщения из очереди сообщений);
  • msgctl для выполнения ряда управляющих действий.

Системный вызов msgget обладает стандартным для семейства "get" системных вызовов синтаксисом:

msgqid = msgget(key, flag);

Ядро хранит сообщения в виде связного списка (очереди), а дескриптор очереди сообщений является индексом в массиве заголовков очередей сообщений. В дополнение к информации, общей для всех механизмов IPC в UNIX System V, в заголовке очереди хранятся также:

  • указатели на первое и последнее сообщение в данной очереди;
  • число сообщений и общее количество байтов данных во всех них вместе взятых;
  • идентификаторы процессов, которые последними послали или приняли сообщение через данную очередь;
  • временные метки последних выполненных операций msgsnd, msgrsv и msgctl.

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

Рис. 3.6. Структуры данных, используемые для организации очередей сообщений

Для посылки сообщения используется системный вызов msgsnd:

msgsnd(msgqid, msg, count, flag);

где msg - это указатель на структуру, содержащую определяемый пользователем целочисленный тип сообщения и символьный массив - собственно сообщение; count задает размер сообщения в байтах, а flag определяет действия ядра при выходе за пределы допустимых размеров внутренней буферной памяти.




- Начало -  - Назад -  - Вперед -