Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

Стивенс Уильям Ричард

Шрифт:

9 if (argc != 4)

10 err_quit("usage: mqsend <name> <#bytes> <priority>");

11 len = atoi(argv[2]);

12 prio = atoi(argv[3]);

13 mqd = Mq_open(argv[1], O_WRONLY);

14 ptr = Calloc(len, sizeof (char));

15 Mq_send(mqd, ptr, len, prio);

16 exit(0);

17 }

И размер сообщения, и его приоритет являются обязательными аргументами командной строки. Буфер под сообщение выделяется функцией callос, которая инициализирует его нулем.

Пример: программа mqreceive

Программа в листинге 5.6 считывает сообщение из очереди.

Листинг 5.6. Программа mqreceive

//pxmsg/mqreceive.с

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 int с flags;

6 mqd_t mqd;

7 ssize_t n;

8 uint_t prio;

9 void *buff;

10 struct mq_attr attr;

11 flags = O_RDONLY;

12 while ((c = Getopt(argc, argv, "n")) != –1) {

13 switch (c) {

14 case 'n':

15 flags |= O_NONBLOCK;

16 break;

17 }

18 }

19 if (optind != argc – 1)

20 err_quit("usage: mqreceive [ –n ] <name>");

21 mqd = Mq_open(argv[optind], flags);

22 Mq_getattr(mqd, &attr);

23 buff = Malloc(attr.mqjnsgsize);

24 n = Mq_receive(raqd, buff, attr.mq_msgsize, &prio);

25 printf("read %ld bytes, priority = %u\n", (long) n, prio);

26 exit(0);

27 }

Параметр -n запрещает блокировку

14-17 Параметр командной строки –n отключает блокировку. При этом программа возвращает сообщение об ошибке, если в очереди нет сообщений.

Открытие очереди и получение атрибутов

21-25 Мы открываем очередь и получаем ее атрибуты, вызвав mq_getattr. Нам обязательно нужно определить максимальный размер сообщения, потому что мы должны выделить буфер подходящего размера, чтобы вызвать mq_receive. Программа выводит размер считываемого сообщения и его приоритет.

ПРИМЕЧАНИЕ

Поскольку n имеет тип size_t и мы не знаем, int это или long, мы преобразуем эту величину к типу long и используем строку формата %ld. В 64-разрядной реализации int будет 32-разрядным целым, a long и size_t будут 64-разрядными целыми.

Воспользуемся обеими программами, чтобы проиллюстрировать использование поля приоритета.

solaris % mqcreate /test1

solaris % mqgetattr /test1 создаем очередь и смотрим на ее атрибуты

max #msgs = 128, max #bytes/msg = 1024, #currently on queue = 0

solaris % mqsend /test1 100 99999 отправка с некорректным значением приоритета

mq_send error: Invalid argument

solaris % mqsend /test1 100 6 100 байт, приоритет 6

solaris % mqsend /test1 50 18 50 байт, приоритет 18

solaris % mqsend /test1 33 18 33 байт, приоритет 18

solaris % mqreceive /test1

read 50 bytes, priority = 18 возвращается старейшее сообщение с

solaris % mqreceive /test1 наивысшим приоритетом

read 33 bytes, priority = 18

Solaris % mqreceive /test1

read 100 bytes, priority = 6

Solaris % mqreceive –n /test1 отключаем блокировку и убеждаемся, что очередь пуста

mq_receive error: Resource temporarily unavailable

Мы видим, что mq_receive действительно возвращает старейшее сообщение с наивысшим приоритетом. 

  • Читать дальше
  • 1
  • ...
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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