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

В сущности, сообщение является просто последовательностью символов или байтов (необязательно заканчивающейся нулевым символом). Сообщения переда­ются между процессами при помощи очередей сообщений (message queues), которые можно создавать или получать к ним доступ при помощи вызова msgget. После создания очереди процесс может помещать в нее сообщения при помощи вызова msgsnd, если он имеет соответствующие права доступа. Затем другой процесс может считать это сообщение при помощи примитива msgrcv, который извлекает сообще­ние из очереди.

Функция msgget определяется следующим образом:

#include <sys/msg.h>

int msgget (key_t key, int permflags);

Этот вызов лучше всего представить как аналог вызова open или creat. Параметр key, который, в сущности, является простым числом, идентифицирует очередь сообщений в системе. В случае успеш­ного вызова, после создания новой очереди или доступа к уже существующей, вызов msgget вернет ненулевое целое значение, которое называется идентифика­тором очереди сообщений (message queue identifier).

Параметр permflags указывает выполняемое вызовом msgget действие, которое задается при помощи двух констант, определенных в файле <sys/ipc.h>; они могут использоваться по отдельности или объединяться при помощи операции побитового ИЛИ:

IPC_CREAT При задании этого флага вызов msgget создает новую очередь сообщений для данного значения, если она еще не существует. Если продолжить аналогию с файлами, то при задании этого флага вызов msgget выполняется в соответствии с вызовом creat, хотя очередь сообщений и не будет «перезаписана», если она уже существует. Если же флаг IPC_CREAT не установ­лен и очередь с этим ключом существует, то вызов msgget вер­нет идентификатор существующей очереди сообщений

IPC_EXCL Если установлен этот флаг и флаг IPC_CREAT, то вызов пред­назначается только для создания очереди сообщений. Поэто­му, если очередь с ключом key уже существует, то вызов msgget завершится неудачей и вернет значение -1. Переменная errno будет при этом содержать значение EEXIST.

При создании очереди сообщений младшие девять бит переменной permflags используются для задания прав доступа к очереди сообщений аналогично коду доступа к файлу. Они хранятся в структуре ipc_perm, создаваемой одновременно с самой очередью.

mqid = msgget((key_t)0100, 0644 | IPC_CREAT | IPC_EXCL);

Этот вызов предназначен для создания (и только создания) очереди сообще­ний для значения ключа равного (key_t) 0100. В случае успешного завершения вызова очередь будет иметь код доступа 0644. Этот код интерпретируется таким же образом, как и код доступа к файлу, обозначая, что создатель очереди может отправлять и принимать сообщения, а члены его группы и все остальные могут выполнять только чтение. При необходимости для изменения прав доступа или владельца очереди может использоваться вызов msgctl.

Работа с очередью сообщений: примитивы msgsnd и msgrcv

После создания очереди сообщений для работы с ней могут использоваться два следующих примитива:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: