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

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

аргумента mode приведены в табл. 2.3. Аргумент attr позволяет задать некоторые атрибуты очереди. Если в качестве этого аргумента задать нулевой указатель, очередь будет создана с атрибутами по умолчанию. Эти атрибуты описаны в разделе 5.3.

Возвращаемое функцией mq open значение называется дескриптором очереди сообщений, но оно не обязательно должно быть (и, скорее всего, не является) небольшим целым числом, как дескриптор файла или программного сокета. Это значение используется в качестве первого аргумента оставшихся семи функций для работы с очередями сообщений.

ПРИМЕЧАНИЕ-

В системе Solaris 2.6 тип mqd t определен как void*, а в Digital Unix 4.0В - как int. В нашем примере в разделе 5.8 эти дескрипторы трактуются как указатели на структуру. Название дескриптор было дано им по ошибке.

Открытая очередь сообщений закрывается функцией mq close:

#include <mqueue.h>

int niq close(niqd t mqdes);

/*Возвращает 0 в случае успешного завершения. -1 в случае ошибки */ По действию эта функция аналогична с1 ose для открытого файла: вызвавший функцию процесс больше не может использовать дескриптор, но очередь сообщений из системы не удаляется. При завершении процесса все открытые очереди сообщений закрываются, как если бы для каждой был сделан вызов nKi c1ose.

Для удаления из системы имени {пате), которое использовалось в качестве аргумента при вызове mq open, нужно использовать функцию mq un1ink:

#include <niqueue.h>

int mq unlink(const char *neme):

I* Возвращает 0 в случае успешного завершения. -1 в случае ошибки */ Для очереди сообщений (как и для файла) ведется подсчет числа процессов, в которых она открыта в данный момент, и по действию эта функция аналогична unlink для файла: имя {пате) может быть удалено из системы, даже пока число подключений к очереди отлично от нуля, но удаление очереди (в отличие от удаления имени из системы) не будет осуществлено до того, как очередь будет закрыта последним использовавшим ее процессом.

Очереди сообщений Posix обладают по меньшей мере живучестью ядра (раздел 1.3), то есть они продолжают существовать, храня все имеющиеся в них сообщения, даже если нет процессов, в которых они были бы открыты. Очередь существует, пока она не будет удалена явно с помощью mq um i nk.

ПРИМЕЧАНИЕ -

Мы увидим, что если очередь сообщений реализована через отображаемые в память файлы (раздел 12.2), она может обладать живучестью файловой системы, но это не является обязательным и рассчитывать на это нельзя.

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

Поскольку очереди сообщений Posix обладают по крайней мере живучестью ядра, можно написать набор небольших программ для работы с ними - с этими



программами будет проще экспериментировать. Программа из листинга 5.1 создает очередь сообщений, имя которой принимается в качестве аргумента командной строки.

Листинг 5.1. Создание очереди сообщений (указан флаг 0 EXCL)

pxmsg/mqcreatel.c

1 #include unp1pc.li

2 int

3 mainCint argc. cliar **argv)

5 int c. flags;

6 mqd t mqd;

7 flags = 0 RDWR 0 CREAT;

8 wliile ( (c = GetoptCargc. argv. e )) !- -1) {

9 switcli (c) {

10 case e;

11 flags I- OJXCL;

12 break;

13 }

14 }

15 if (optind !- argc - 1)

16 err quit( usage; mqcreate [ -e ] <name> );

17 mqd - Mq open(argv[optind]. flags. FILE MOOE. NULL);

18 Mq close(mqd):

19 exit(O);

20 }

В командной строке можно указать параметр -е, управляющий исключающим созданием очереди. (О функции getopt и нашей обертке Getopt рассказано более подробно в комментарии к листингу 5.5.) При возвращении функция getopt сохраняет в переменной opti nd индекс следующего аргумента, подлежащего обработке.

Мы вызываем функцию mq open, указывая ей в качестве имени IPC полученный из командной строки параметр, не обращаясь к рассмотренной нами в разделе 2.2 функции px ipc name. Это даст нам возможность узнать, как в данной реализации обрабатываются имена Posix IPC (мы используем для этого наши маленькие тестовые программы на протяжении всей книги).

Ниже приведен результат работы программы в Solaris 2.6:

Solaris % mqcreatel /temp.1234 очередь успешно создается

Solaris % s - /tmp/.*1234

-rw-rw-rw- 1 rstevens otiierl 132632 Oct 23 17;08 /tmp/.MQOtemp. 1234

-rw-rw-rw- 1 rstevens otiierl 0 Oct 23 17:08 /tmp/.MQLtemp. 1234

-rw-r--r-- 1 rstevens otiierl 0 Oct 23 17:08 /tmp/.MQPOtemp. 1234 Solaris % mqcreatel -e /temp.1234 очередь уже создана

mq open error for /temp.1234: File exists



Мы назвали эту версию программы mqcreatel, поскольку она будет улучшена в листинге 5.4, после того как мы обсудим использование атрибутов очереди. Разрешения на доступ к третьему файлу определяются константой FILE MODE (чтение и запись для пользователя, только чтение для группы и прочих пользователей), но у двух первых файлов разрешения отличаются. Можно предположить, что в файле с буквой D в имени хранятся данные; файл с буквой L представляет собой какую-то блокировку, а в файле с буквой Р хранятся разрешения.

В Digital Unix 4.0В мы указываем действительное имя создаваемого файла:

alpha % mqcreatel /tmp/myq.1234 очередь успешно создается

alpha % s - /tmp/myq.l234

-rw-r--r-- 1 rstevens system 11976 Oct 23 17:04 /tmp/myq.1234 alpha % mqcreatel -e /tmp/myq.1234 очередь уже создана

mq open error for /tmp/myq.1234; File exists

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

в листинге 5.2 приведена программа mqunlink, удаляющая из системы очередь сообщений.

Листинг 5.2. Удаление очереди из системы: mq unlink

pxmsg/mqunlink.c

1 #include unpipc.h

2 int

3 mainCint argc. char **argv)

5 if (argc h 2)

6 err quit( usage: mqunlink <name> );

7 Mq unlink(argv[l]);

8 exitCO):

С помощью этой программы мы можем удалить очередь сообщений, созданную программой mqcreatel: Solaris % mqunlink /temp.1234

При этом будут удалены все три файла из каталога /tmp, которые относятся к этой очереди.

5.3. Функции mq getattr и mq setattr

у каждой очереди сообщений имеются четыре атрибута, которые могут быть получены функцией mq getattr и установлены (по отдельности) функцией mq setattr: #include <mqueue.h>

int mq getattr(mqd t mqdes. struct mq attr *attr):

int mq setattr(mqd t mqdes. const struct mq attr *attr. struct mq attr *oattr): I* Обе функции возвращают О в случае успешного завершения;

-1 - в случае возникновения ошибок */



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.
Копирование материалов разрешено исключительно при условии цититирования.