Лекция: II. Очереди сообщений.

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

  • msgget() для образования новой очереди сообщений или получения дескриптора существующей очереди;
  • msgsnd() для постановки сообщения в указанную очередь сообщений;
  • msgrcv() для выборки сообщения из очереди сообщений;
  • msgctl() для выполнения ряда управляющих действий

Прототипы перечисленных системных вызовов описаны в файлах

#include <sys/ipc.h>

#include <sys/msg.h>

По системному вызову msgget() в ответ на ключ (key) и набор флагов (полностью аналогичны флагам в системном вызове semget()) ядро либо создает новую очередь сообщений и возвращает пользователю идентификатор созданной очереди, либо находит элемент таблицы очередей сообщений, содержащий указанный ключ, и возвращает соответствующий идентификатор очереди:

int msgqid = msgget(key_t key, int flag).

Для помещения сообщения в очередь служит системный вызов msgsnd():

int msgsnd (int msgqid, void *msg, size_t size, int flag),

где msg — это указатель на структуру длиной size, содержащую определяемый пользователем целочисленный тип сообщения и символьный массив-сообщение.

Структура msg имеет вид:

struct msg {

long mtype; /* тип сообщения */

char mtext[SOMEVALUE]; /* текст сообщения (SOMEVALUE — любое */};

Параметр flag определяет действия ядра при выходе за пределы допустимых размеров внутренней буферной памяти (флаг IPC_NOWAIT со значением, рассмотренным выше).

Условиями успешной постановки сообщения в очередь являются:

  • наличие прав процесса по записи в данную очередь сообщений;
  • не превышение длиной сообщения заданного системой верхнего предела;
  • положительное значение указанного в сообщении типа сообщения.

Если же оказывается, что новое сообщение невозможно буферизовать в ядре по причине превышения верхнего предела суммарной длины сообщений, находящихся в данной очереди сообщений (флаг IPC_NOWAIT при этом отсутствует), то обратившийся процесс откладывается (усыпляется) до тех пор, пока очередь сообщений не разгрузится процессами, ожидающими получения сообщений.

Для приема сообщения используется системный вызов msgrcv():

int msgrcv (int msgqid, void *msg, size_t size, long msg_type, int flag);

Системный вызов msgctl()

int msgctl (int msgqid, int command, struct msqid_ds *msg_stat)

используется

  • для опроса состояния описателя очереди сообщений (command = IPC_STAT) и помещения его в структуру msg_stat (детали опускаем);
  • изменения его состояния (command = IPC_SET), например, изменения прав доступа к очереди;
  • для уничтожения указанной очереди сообщений (command = IPC_RMID).
еще рефераты
Еще работы по информатике