В сущности, сообщение является просто последовательностью символов или байтов (необязательно заканчивающейся нулевым символом). Сообщения передаются между процессами при помощи очередей сообщений (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
После создания очереди сообщений для работы с ней могут использоваться два следующих примитива: