Читаем 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; /* тип сообщения */

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

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

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

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

Веб-аналитика: анализ информации о посетителях веб-сайтов
Веб-аналитика: анализ информации о посетителях веб-сайтов

Компании в веб-пространстве тратят колоссальные средства на веб-аналитику и оптимизацию своих веб-сайтов, которые, в свою очередь, приносят миллиарды долларов дохода. Если вы аналитик или работаете с веб-данными, то эта книга ознакомит вас с новейшими точками зрения на веб-аналитику и то, как с ее помощью сделать вашу компанию весьма успешной в веб. Вы изучите инструментальные средства и показатели, которые можно использовать, но что важнее всего, эта книга ознакомит вас с новыми многочисленными точками зрения на веб-аналитику. Книга содержит много советов, приемов, идей и рекомендаций, которые вы можете взять на вооружение. Изучение веб-аналитики по этой уникальной книге позволит познакомиться с проблемами и возможностями ее современной концепции. Написанная практиком, книга охватывает определения и теории, проливающие свет на сложившееся мнение об этой области, а также предоставляет поэтапное руководство по реализации успешной стратегии веб-аналитики.Эксперт в данной области Авинаш Кошик в присущем ему блестящем стиле разоблачает укоренившиеся мифы и ведет по пути к получению действенного понимания аналитики. Узнайте, как отойти от анализа посещаемости сайта, почему основное внимание следует уделять качественным данным, каковы методы обретения лучшего понимания, которое поможет выработать мировоззрение, ориентированное на мнение клиента, без необходимости жертвовать интересами компании.- Изучите все преимущества и недостатки методов сбора данных.- Выясните, как перестать подсчитывать количество просмотренных страниц, получить лучшее представление о своих клиентах.- Научитесь определять ценность показателей при помощи тройной проверки "Ну и что".- Оптимизируйте организационную структуру и выберите правильный инструмент аналитики.- Изучите и примените передовые аналитические концепции, включая анализ SEM/PPC, сегментацию, показатели переходов и др.- Используйте решения с быстрым началом для блогов и электронной торговли, а также веб-сайтов мелкого бизнеса.- Изучите ключевые компоненты платформы экспериментирования и проверки.- Используйте анализ конкурентной разведки для обретения понимания и принятия мер.Здесь также находятся:- Десять шагов по улучшению веб-аналитики.- Семь шагов по созданию управляемой данными культуры в организации.- Шесть способов замера успеха блога.- Три секрета создания эффективной веб-аналитики.- Десять признаков великого веб-аналитика.

Авинаш Кошик

ОС и Сети, интернет