Чтение онлайн

на главную - закладки

Жанры

Linux: Полное руководство

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

Шрифт:

Вместе с режимом 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");

}

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

Для постановки сообщения в очередь используется вызов 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 <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 и посмотрите на статус только что отправленного сообщения. Теперь напишем программу, которая получит это сообщение.

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

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Eroshort

Eroshort
Дом и Семья:
образовательная литература
3.40
рейтинг книги
Eroshort

Старый, но крепкий 2

Крынов Макс
2. Культивация без насилия
Фантастика:
рпг
уся
эпическая фантастика
5.00
рейтинг книги
Старый, но крепкий 2

Законы Рода. Том 4

Мельник Андрей
4. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 4

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Двойник короля 12

Скабер Артемий
12. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 12

Эволюционер из трущоб. Том 4

Панарин Антон
4. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 4

Алтарь

Жгулёв Пётр Николаевич
3. Real-Rpg
Фантастика:
фэнтези
7.00
рейтинг книги
Алтарь

Деревенщина в Пекине 2

Афанасьев Семён
2. Пекин
Фантастика:
попаданцы
дорама
фантастика: прочее
5.00
рейтинг книги
Деревенщина в Пекине 2

Герцог. Книга 1. Формула геноцида

Юллем Евгений
1. Псевдоним "Испанец" - 2
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Герцог. Книга 1. Формула геноцида

Воевода

Ланцов Михаил Алексеевич
5. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Воевода

Отморозок 3

Поповский Андрей Владимирович
3. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 3

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15