Главная страница  Взаимодействие нетривиальных процессов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [ 29 ] 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

Структура 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 байт.



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [ 29 ] 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.