uid | Идентификатор владельца-пользователя объекта |
gid | Идентификатор владельца-группы объекта |
cuid | UID создателя объекта |
cgid | GID создателя объекта |
mode | Права доступа на чтение и запись для всех классов доступа (9 битов) |
key | Ключ объекта |
Права доступа (как и для файлов) определяют возможные операции, которые может выполнять над объектом конкретный процесс (получение доступа к существующему объекту, чтение, запись и удаление).
Заметим, что система не удаляет созданные объекты IPC даже тогда, когда ни один процесс не пользуется ими. Удаление созданных объектов является обязанностью процессов, которым для этого предоставляются соответствующие функции управления
Сообщения
Как уже обсуждалось, очереди сообщений являются составной частью UNIX System V, они обслуживаются операционной системой, размещаются в адресном пространстве ядра и являются разделяемым системным ресурсом. Каждая очередь сообщений имеет свой уникальный идентификатор. Процессы могут записывать и считывать сообщения из различных очередей. Процесс, пославший сообщение в очередь, может не ожидать чтения этого сообщения каким-либо другим процессом. Он может закончить свое выполнение, оставив в очереди сообщение, которое будет прочитано другим процессом позже.
Данная возможность позволяет процессам обмениваться структурированными данными, имеющими следующие атрибуты:
Тип сообщения (позволяет мультиплексировать сообщения в одной очереди)
Длина данных сообщения в байтах (может быть нулевой)
Собственно данные (если длина ненулевая, могут быть структурированными)
Очередь сообщений хранится в виде внутреннего однонаправленного связанного списка в адресном пространстве ядра. Для каждой очереди ядро создает заголовок очереди (msqid_ds
), где содержится информация о правах доступа к очереди (msg_perm
), ее текущем состоянии (msg_cbytes
— число байтов и msg_qnum
— число сообщений в очереди), а также указатели на первое (msg_first
) и последнее (msg_last
) сообщения, хранящиеся в виде связанного списка (рис. 3.18). Каждый элемент этого списка является отдельным сообщением.
Рис. 3.18. Структура очереди сообщений
Для создания новой очереди сообщений или для доступа к существующей используется системный вызов
#include
#include
#include
int msgget(key_t key, int msgflag);
Функция возвращает дескриптор объекта-очереди, либо -1 в случае ошибки. Подобно файловому дескриптору, этот идентификатор используется процессом для работы с очередью сообщений. В частности, процесс может:
Помещать в очередь сообщения с помощью функции
Получать сообщения определенного типа из очереди с помощью функции
Управлять сообщениями с помощью функции
Перечисленные системные вызовы манипулирования сообщениями имеют следующий вид:
#include
#include
#include
int msgsnd(int msqid, const void *msgp,
size_t msgsz, int msgflg);
int msgrcv(int msqid, void *msgp,
size_t msgsz, long msgtyp, int msgflg);
Здесь msgid
является дескриптором объекта, полученного в результате вызова msgtyp
указывает на буфер, содержащий тип сообщения и его данные, размер которого равен msgsz
байт. Буфер имеет следующие поля:
long msgtype | тип сообщения |
char msgtext[] | данные сообщения |
Аргумент msgtyp
указывает на тип сообщения и используется для их выборочного получения. Если msgtyp
равен 0, функция msgtyp
выше 0, будет получено первое сообщение указанного типа. Если msgtyp
меньше 0, функция msgtyp
.
Очереди сообщений обладают весьма полезным свойством — в одной очереди можно мультиплексировать сообщения от различных процессов. Для демультиплексирования используется атрибут msgtype
, на основании которого любой процесс может фильтровать сообщения с помощью функции