#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.
Читать дальше