Книга: UNIX: взаимодействие процессов

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

Пример: программа 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 инициализируются О */
3  int
4  main(int argc, char **argv)
5  {
6   int с flags;
7   mqd_t mqd;
8   flags = O_RDWR | O_CREAT;
9   while ((c = Getopt(argc, argv, "em:z:")) != –1) {
10   switch (c) {
11   case 'e':
12    flags |= O_EXCL;
13    break;
14   case 'm':
15    attr.mq_maxmsg = atol(optarg);
16    break;
17   case 'z':
18    attr.mq_msgsize = atol(optarg);
19    break;
20   }
21  }
22  if (optind != argc – 1)
23   err_quit("usage: mqcreate [ –е ] [ –m maxmsg –z msgsize ] <name>");
24  if ((attr.mq_maxmsg != 0 && attr.mq_msgsize ==0) ||
25   (attr.mq_maxmsg == 0 && attr.mq_msgsize != 0))
26   err_quit("must specify both –m maxmsg and –z msgsize");
27  mqd = Mq_open(argv[optind], flags, FILE_MODE,
28   (attr.mq_maxmsg != 0) ? &attr : NULL);
29  Mq_close(mqd);
30  exit(0);
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 –e –m 1024 -z 8192 /foobar
solaris % ls –al /tmp/.*foobar
-rw-rw-rw– 1 rstevens other1 8397336 Oct 25 11:29 /tmp/.MQDfoobar
–rw-rw-rw– 1 rstevens other1       0 Oct 25 11:29 /tmp/.MQLfoobar
–rw-r--r-- 1 rstevens other1       0 Oct 25 11:29 /tmp/.MQPfoobar

Размер файла, содержащего данные этой очереди, соответствует максимальному количеству сообщений в очереди и максимальному размеру сообщения (1024?8192 = 8388608), а оставшиеся 8728 байт предусматривают 8 байт информации на каждое сообщение (8?1024) плюс дополнительные 536 байт. 

При выполнении той же программы в Digital Unix 4.0B получим:

alpha % mqcreate –m 256 -z 2048 /tmp/bigq
alpha % ls-l/tmp/bigq
-rw-r--r-- 1 rstevens system 537288 Oct 25 15:38 /tmp/bigq

В этой реализации размер очереди соответствует максимальному количеству сообщений и максимальному размеру сообщения (256?2048 = 524288), а оставшиеся 13000 байт дают возможность хранить 48 байт добавочной информации для каждого сообщения (48?256) и еще 712 байт.

Оглавление книги


Генерация: 1.203. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз