Читаем Linux: Полное руководство полностью

Для создания очереди сообщений используется системный вызов msgget(). Этот же вызов используется для подключения к уже существующей очереди:

int msgget(key_t key, int msgflg);

Первый аргумент — это ключ, который мы получаем с помощью системного вызова ftok(). Второй аргумент — это режим доступа к очереди:

♦ IPC_CREAT — создать очередь, если она не была создана ранее.

♦ IPC_EXCL — если использовать вместе с IPC_CREAT, то в случае, если очередь существует, мы получим ошибку.

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

Вместе с режимом IPC_CREAT можно указывать права доступа к очереди с помощью операции OR:

IPC_CREAT | 0660

Если произошла ошибка и msgget() вернул -1, то переменная errno устанавливается следующим образом:

♦ EACCESS — у вас нет прав доступа к объекту IPC;

♦ EEXIST — очередь уже существует, создание невозможно, но возможно подключение к очереди;

♦ EIDRM — очередь помечена для удаления;

♦ ENOENT — очередь не существует (в случае подключения);

♦ ENOMEM — не хватает памяти для создания очереди;

♦ ENOSPC — не хватает адресного пространства (то есть превышено максимальное количество очередей).

Следующий код создает очередь сообщений:

key_t key; /* ключ IPC */

int id; /* ID очереди сообщений */

/* создаем ключ */

key = ftok(".", 'd');

/* создаем очередь */

if ((id = msgget(key, IPC_CREAT | 0660 )) == -1) {

 printf("Ошибка при создании очереди\n");

}

<p>26.5.3. Постановка сообщения в очередь</p>

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

int msgsnd(int msqid, struct msgbuf *msgp, int msgsz,

 int msgflg);

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

Как обычно, в случае успеха вызов возвращает 0, а если произошла ошибка, то -1. С помощью errno можно анализировать ошибку:

♦ EAGAIN — очередь переполнена, а вы используете флаг IPC_NOWAIT, то есть сообщение будет удалено и вам нужно заново поставить его в очередь (отсюда и название ошибки — AGAIN (опять));

♦ EACCESS — у вас недостаточно прав для записи сообщения в очередь;

♦ EFAULT— неверный адрес буфера msgp (невозможно получить доступ к этому адресу);

♦ EIDRM — очередь сообщений удалена;

♦ EINVAL — ошибка в аргументах, например, неправильное значение идентификатора очереди, отрицательный тип сообщения, неправильный размер сообщения и т.д.

♦ ENOMEM — не хватает памяти.

Следующий фрагмент кода демонстрирует постановку сообщения в очередь;

int res, length; /* результат операции и длина сообщения */

struct my_buf *buf; /* само сообщение */

/* определяем длину сообщения — 4 байта */

length = sizeof(struct my_buf) - sizeof(long);

if ((res = msgsnd( id, &buf, length, 0)) == -1) {

 printf("Ошибка при постановке сообщения в очередь\n");

}

Наверное, вам уже не терпится увидеть реально работающий пример, а не куски кода, которые только отчасти связаны между собой. В листинге 26.5 представлена программа, создающая очередь сообщения и записывающая в нее сообщение.

Листинг 26.5. Пример работы с очередью

#include

#include

#include

#include

main() {

 int id; /* Идентификатор очереди */

 key_t key; /* Ключ */

 int res, length; /* Результат операции и длина сообщения */

 struct my_buf {

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

  /* Далее следуют произвольные поля -

Перейти на страницу:

Все книги серии Полное руководство

Похожие книги

Полное руководство по Microsoft Windows XP
Полное руководство по Microsoft Windows XP

В книге известного американского автора описывается среда ОС Windows XP и принципы ее функционирования, приведен сравнительный анализ Windows XP с предшествующими версиями операционной системы Windows. Рассматриваются вопросы применения и модификации нового интерфейса с целью получения прямого доступа ко всем функциям Windows XP обсуждаются варианты подключения к компьютерным сетям. Несколько разделов посвящены работе с реестром и конфигурационными файлами, мультимедийным функциям и разнообразным системным службам, а также методам решения проблем с программным обеспечением и оборудованием. Особое внимание уделено обеспечению безопасности операционной системы.Издание адресовано пользователям и сетевым администраторам, желающим активно применять возможности операционной системы Windows XP (в том числе и недокументированные).

Джон Поль Мюллер , Питер Нортон

ОС и Сети, интернет / ОС и Сети / Книги по IT