Главная страница Взаимодействие нетривиальных процессов Структура mq attr хранит в себе эти четыре атрибута: struct niq attr { long mq flags: /* флаг очереди; 0. 0 NONBLOCK */ long mq maxmsg: /* максимальное количество сообщений в очереди */ long mq msgsize; /* максимальный размер сообщения (в байтах) */ long mq curmsgs; текущее количество сообщений в очереди Указатель на такую структуру может быть передан в качестве четвертого аргумента пк1 ореп, что дает возможность установить параметры mq maxmsg и mqmsgsi ze в момент создания очереди. Другие два поля структуры функцией mq open игнорируются. Функция mq getattr присваивает полям структуры, на которую указывает attr, текущие значения атрибутов очереди. Функция mq setattr устанавливает атрибуты очереди, но фактически используется только поле mqflags той структуры, на которую указывает attr, что дает возможность сбрасывать или устанавливать флаг запрета блокировки. Другие три поля структуры игнорируются: максимальное количество сообщений в очереди и максимальный размер сообщения могут быть установлены только в момент создания очереди, а количество сообщений в очереди можно только считать, но не изменить. Кроме того, если указатель oattr ненулевой, возвращаются предыдущие значения атрибутов очереди (mq f lags, mq maxmsg, mq msgsize) и текущий статус очереди (mq curmsgs). Пример: программа mqgetattr Программа из листинга 5.3 открывает указанную очередь сообщений и выводит значения ее атрибутов. Листинг 5.3. Получение и вывод значений атрибутов очереди сообщений pxmsg/mqgetattr.c 1 #include unpipc.li 2 int 3 HBinCint argc. cliar **argv) 5 niqd t mqd; 6 struct mq attr attr; 7 if (argc !- 2) 8 err quit( usage: mqgetattr <name> ); 9 mqd = Mq open(argv[l]. 0 ROONLY): 10 Mq getattr(mqd. &attr); 11 printf( max #msgs = *ld. max #bytes/msg - *ld. 12 #currently on queue - *ld\n . 13 attr.mq maxmsg. attr.mq msgsize. attr.mq curmsgs); 14 Mq close(mqd): 15 ex1t(0); 16 } Мы можем создать очередь сообщений и вывести значения ее атрибутов, устанавливаемые по умолчанию: Solaris % mqcreatel /hello.world Solaris % mqgetattr /hello.world max #msgs - 128. max #bytes/msg - 1024. #currently on queue - 0 Вспомним размер одного из файлов очереди, созданной с использованием устанавливаемых по умолчанию значений атрибутов. Он был выведен командой Is в примере после листинга 5.1. Это значение можно получить как 128x 1024 + 1560 = 132 632. Добавочные 1560 байт представляют собой, скорее всего, дополнительную информацию: 8 байт на сообщение плюс добавочные 536 байт. Пример: программа mqcreate Мы можем изменить программу из листинга 5.1 таким образом, чтобы при создании очереди иметь возможность указывать максимальное количество сообщений и максимальный размер сообщения. Мы не можем указать только один из этих параметров; нужно обязательно задать оба (см., впрочем, упражнение 5.1). В листинге 5.4 приведен текст новой программы. Листинг 5.4. Усовершенствованная программа mqcreate pxmsg/mqcreate.c 1 #include unpipc.h 2 struct mq attr attr; /* mq maxmsg и mq msgsize инициализируются 0 */ 3 int 4 mainCint argc. char **argv) 6 int c. flags; 7 mqd t mqd; 8 flags - 0 ROWR 0 CREAT: 9 while ( (c - GetoptCargc. argv. em;z: )) != -1) { 10 switch (c) { 11 case e; 12 flags!-OJXCL: 13 break; 14 case m; 15 attr.mq maxmsg - atoKoptarg); 16 break; 17 case z; 18 attr.mq msgsize - atoKoptarg); 19 break; 20 } 21 } 22 if (optind !- argc - 1) продолжение Листинг 5.4 (продолжение) 23 err quit( usage: mqcreate [ -е ] [ -m maxmsg -z msgsize ] <name> ): 24 if ((attr.mq maxrasg !- 0 && attr.mq msgsize =-0) 25 (attr.mq maxmsg - 0 && attr.mq msgsize != 0)) 26 err quit( must specify botli -m maxmsg and -z msgsize ); 27 mqd = Mq open(argv[optind]. flags. FILE MOOE. 28 (attr.mq maxmsg h 0) ? &attr i NULL); 29 Mq close(mqd): 30 exit(O): 31 } Параметр командной строки, требующий аргумента, указывается с помощью двоеточия (после параметров m и z в вызове getopt). В момент обработки символа параметр optarg указывает на аргумент. ПРИМЕЧАНИЕ- Наша обертка Getopt вызывает стандартную библиотечную функцию getopt и завершает выполнение процесса в случае возникновения ошибок в ее работе: при появлении параметра, не указанного в третьем аргументе при вызове функции, или при наличии параметра без необходимого числового аргумента (потребность в нем указывается с помощью двоеточия после буквы параметра в третьем аргументе функции getopt). В любом случае, getopt помещает сообщение об ошибке в стандартный поток сообщений об ошибках и возвращает ошибку, что приводит к завершению работы оберткой Getopt. В двух приведенных ниже примерах ошибка обнаруживается функцией getopt: Solaris % mqcreate -z mqcreate: option requires an argument - z Solaris % mqcreate -q mqcreate; illegal option - q В следующем примере ошибка (не указан необходимый аргумент - имя очереди) обнаруживается самой программой: Solaris % mqcreate usage: mqcreate [ -e ] [ -m maxmsg -z msgsize ] <name> Если не указан ни один из двух новых параметров, мы должны передать функции mq open пустой указатель в качестве последнего аргумента. В противном случае мы передаем указатель на нашу структуру attr. Запустим теперь новую версию нашей программы в системе Solaris 2.6, указав максимальное количество сообщений 1024 и максимальный размер сообщения 8192 байт: Solaris % mqcreate -е -m 1024 -z 8192 /foobar Solaris % Is -al /tmp/.*foobar -rw-rw-rw- 1 rstevens otiierl 8397336 Oct 25 11:29 /tmp/.MQOfoobar -rw-rw-rw- 1 rstevens otiierl 0 Oct 25 11:29 /tmp/.MQLfoobar -rw-r-r-- 1 rstevens otherl 0 Oct 25 11:29 /tmp/.MQPfoobar Размер файла, содержащего данные этой очереди, соответствует максимальному количеству сообщений в очереди и максимальному размеру сообщения (1024 X 8192 = 8 388 608), а оставшиеся 8728 байт предусматривают 8 байт информации на каждое сообщение (8x1024) плюс дополнительные 536 байт.
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |