#include
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
int msgget(key_t key, int msgflg);
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);
Как и в случае семафоров или совместно используемой памяти, заголовочные файлы sys/types.h и sys/ipc.h обычно автоматически включаются заголовочным файлом msg.h.
Очередь сообщений создается и предоставляет к себе доступ с помощью функции msgget
:
int msgget(key_t key, int msgflg);
Программа должна предоставить значение параметра key
, которое, как и в других средствах IPC, задает имя конкретной очереди сообщений. С помощью специального значения IPC_PRIVATE
создается скрытая или частная очередь, которая теоретически доступна только текущему процессу. Как и в случае семафоров и совместно используемой памяти, в некоторых системах Linux такая очередь может не быть частной. Поскольку от скрытой или частной очереди очень мало пользы, это не слишком важная проблема. Как и раньше, второй параметр msgflg
состоит из девяти флагов прав доступа. Для создания новой очереди сообщений специальный бит со значением IPC_CREAT
должен быть объединен с правами доступа поразрядной операцией OR
. Не считается ошибкой установка флага IPC_CREAT
и задание ключа уже существующей очереди сообщений. Если очередь уже есть, флаг IPC_CREAT
безмолвно игнорируется.
Функция msgget
вернет положительное число, идентификатор очереди; в случае успешного завершения и -1 в случае сбоя.
Функция msgsnd
позволяет добавить сообщение в очередь сообщений:
int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);
Структура сообщения ограничена двумя способами. Во-первых, она должна быть меньше системного ограничения, и во-вторых, она должна начинаться с элемента типа long int
, который будет использован как тип сообщения в получающей функции. Если вы применяете сообщения, лучше всего определить структуру сообщения следующим образом.
struct my_message {
long int message_type;
/* Данные, которые вы собираетесь передавать */
}
Поскольку элемент message_type
используется при получении сообщения, вы не можете его просто игнорировать. Вы должны включить его в вашу структуру данных, и будет разумно инициализировать его с помощью известного значения.
Первый параметр msqid
— идентификатор очереди сообщений, возвращаемый функцией msgget
.
Второй параметр msg_ptr
— указатель на отправляемое сообщение, которое должно начинаться с элемента типа long int
, как описывалось ранее.
Третий параметр msg_sz
— объем сообщения, на которое указывает msg_ptr
. Этот объем не должен включать элемент типа long int
, содержащий тип сообщения.
Четвертый параметр msgflg
управляет действиями, предпринимаемыми при заполнении текущей очереди сообщений или достижении общесистемного ограничения для очередей сообщений. Если в параметре msgflg
установлен флаг IPC_NOWAIT
, функция вернет управление немедленно без отправки сообщения и возвращаемое значение будет равно -1. Если в параметре msgflg
флаг IPC_NOWAIT
сброшен, процесс отправки будет приостановлен в ожидании освобождения доступного объема в очереди.
В случае успеха функция вернет 0, а в случае аварийного завершения — -1. Если вызов был успешен, копия данных сообщения принимается и помещается в очередь сообщений.
Функция msgrcv
извлекает сообщения из очереди сообщений:
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
Первый параметр msqid
— идентификатор очереди сообщений, возвращенный функцией msgget.
Второй параметр msg_ptr
— указатель на получаемое сообщение, которое должно начинаться с элемента типа long int
, как описывалось ранее в функции msgsnd
.
Третий параметр msg_sz
— размер сообщения, на которое указывает msg_ptr
, без элемента типа long int
, содержащего тип сообщения.
Четвертый параметр msgtype
типа long int
позволяет реализовать простую форму приоритетного получения. Если значение msgtype
равно 0, извлекается первое доступное сообщение в очереди. Если значение параметра больше нуля, извлекается первое сообщение с таким же типом сообщения. Если оно меньше нуля, извлекается первое сообщение с таким же типом сообщения или со значением, по абсолютной величине меньшим, чем msgtype
.
Читать дальше