Вход/Регистрация
Linux: Полное руководство
вернуться

Аллен Питер В.

Шрифт:

♦ 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 <stdio.h>

#include <stdlib.h>

#include <linux/ipc.h>

#include <linux/msg.h>

main {

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

 key_t key; /* Ключ */

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

 struct my_buf {

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

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

они зависят от сообщения */

int op_type; /* тип операции */

int l_ор; /* первый операнд */

int r_op; /* второй операнд */

 } msg;

 /* Генерируем IPC-ключ */

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

 /* Создаем очередь или присоединяемся к уже существующей */

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

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

exit(1);

 }

 /* Заполняем сообщение */

 msg.type = 1; /* тип сообщения,

должен быть положительным! */

 msg.op_.type = 0; /* тип операции */

 msg.l_op = 6;

 msg.r_op = 5;

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

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

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

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

exit(1);

 }

}

После запуска этой программы запустите программу ipcs и посмотрите на статус только что отправленного сообщения. Теперь напишем программу, которая получит это сообщение.

26.5.4. Получение сообщений очереди

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

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

 long mtype, int msgflg);

Первый аргумент определяет очередь, из которой нужно получить сообщение. Второй аргумент — это адрес буфера, в который будет записано сообщение. Третий аргумент — это ограничитель длины сообщения. Четвертый аргумент — это тип сообщения. Ядро будет искать в очереди наиболее старое сообщение данного типа и вернет его копию. Если mtype=0, то ядро вернет самое старое сообщение независимо от типа.

После успешного получения сообщения оно удаляется из очереди.

В случае успеха вызов msqrcv возвращает число байтов, скопированных в буфер, или -1 в случае ошибки. Переменная errno устанавливается следующим образом:

♦ E2BIG — длина сообщения больше, чем ограничитель msgsz;

♦ EACCESS — у вас недостаточно прав;

♦ EFAULT — недоступен адрес буфера;

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

♦ EINTR — операция прервана поступившим сигналом;

  • Читать дальше
  • 1
  • ...
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: