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

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

Таблица 6.1 (продолжение)

type

Тип возвращаемого сообщения

-100

-200

-300

Аргумент flag указывает, что делать, если в очереди нет сообщения с запрошенным типом. Если установлен бит IPC NOWAIT, происходит немедленный возврат из функции msgrcv с кодом ошибки ENOMSG. В противном случае вызвавший процесс блокируется до тех пор, пока не произойдет одно из следующего: Я появится сообщение с запрошенным типом;

Ш очередь с идентификатором msqid будет удалена из системы (в этом случае

будет возвращена ошибка с кодом ЕIDRM); вызвавший поток будет прерван перехватываемым сигналом (в этом случае

возвращается ошибка EINTR).

в аргументе flag можно указать дополнительный бит MSG NOERROR. При установке этого бита данные, превышающие объем буфера (аргумент length), будут просто обрезаться до его размера без возвращения кода ошибки. Если этот флаг не указать, при превышении объемом сообщения аргумента /engtA будет возвращена ошибка E2BIG.

в случае успешного завершения работы msgrcv возвращает количество байтов в принятом сообщении. Оно не включает байты, нужные для хранения типа сообщения (long), который также возвращается через указательрЛ .

6.5. Функция msgcti

Функция msgcti позволяет управлять очередями сообщений: #inclucle <sys/nisg.h>

int msgcti (int msqid. int and. struct msqicl cls *buff):

I* Возвращает 0 в случае успешного завершения, -1 в случае ошибки */

Команд (аргумент cmd) может быть три:

ж I PC RMID - удаление очереди с идентификатором msqid из системы. Все сообщения, имеющиеся в этой очереди, будут утеряны. Мы уже видели пример действия этой функции в листинге 3.2. Для этой команды третий аргумент функции игнорируется.

ш IPC SET - установка значений четырех полей структуры msqi d ds данной очереди равными значениям соответствующих полей структуры, на которую указывает аргумент buff. msg perm.uid, msg perm.gid, msg perm.mode, msg qbytes.

IPC STAT - возвращает вызвавшему процессу (через аргумент buff) текущее содержимое структуры msqid ds для указанной очереди.

Пример

Программа в листинге 6.1 создает очередь сообщений, помещает в нее сообщение с 1 байтом информации, вызывает функцию msgcti с командой IPC STAT, выпол-



няет команду ipcs, используя функцию system, а затем удаляет очередь, вызвав функцию msgctl с командой IPC RMID.

Листинг 6.1Пример использования функции msgctl с командой IPC STAT

svmsg/ctl.с

1 finclude unpipc.h

2 int

3 mainCint argc. char **argv)

5 int msqid:

6 struct msqid ds info:

7 struct msgbuf buf:

8 msqid - Msgget(IPC PRIVATE. SVMSG MODE IPC CREAT):

9 buf.mtype = 1;

10 buf.mtextEO] - 1:

11 MsgsndCmsqid. &buf. 1. 0):

12 MsgctKmsqid. IPCJTAT. &info);

13 printf( read-write: Шо. cbytes = lu. qnum = lu. qbytes = lu\n .

14 info.msg perm.mode & 0777. (ulong t) info.msg cbytes.

15 (ulong t) info.msg qnum. (ulong t) info.msg qbytes):

16 system( ipcs -q ):

17 MsgctKmsqid. IPC RMID. NULL):

18 exitCO):

19 }

Мы собираемся отправить сообщение размером 1 байт, поэтому можно просто воспользоваться стандартным определением структуры msgbuf из <sys/msg. h>. Выполнение этой программы приведет к следующему результату: Solaris % ctl

read-write: 664. cbytes = 1. qnum = 1. qbytes = 4096 IPC status from <running system> as of MOn Oct 20 15:36:49 1997 T ID Key MODE OWNER GROUP

Message Queues:

q 1150 00000000 --rw-rw-r-- rstevens otherl

Выведенные значения соответствуют ожидаемым. Нулевое значение ключа обычно соответствует IPC PRI\/ATE, как мы отмечали в разделе 3.2. В этой системе на очередь сообщений накладывается ограничение по объему в 4096 байт. Поскольку мы записали сообщение с 1 байтом данных и msg cbytes имеет значение 1, это ограничение накладывается на объем полезных данных и не включает тип сообщения (long), указываемый для каждого сообщения.

6.6. Простые примеры

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



Программа msgcreate

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

9-12 Параметр командной строки -е позволяет указать флаг IPC EXCL.

16 Полное имя файла, являющееся обязательным аргументом командной строки, передается функции ftok. Получаемый ключ преобразуется в идентификатор функцией msgget.

Листинг 6.2. Создание очереди сообщений System V

svmsg/msgcreate.c

1 #inclucle unpipc.h

2 int

3 mainCint argc. char **argv)

5 int c. oflag. mqid:

6 oflag = SVMSG MODE IPC CREAT;

7 while ( (c = GetoptCargc. argv. e )) ]= -1) {

8 switch (c) {

9 case e:

10 oflag I- IPCJXCL:

11 break:

12 }

13 }

14 if (optind != argc - 1)

15 err quit( usage: msgcreate [ -e ] <pathname> ):

16 mqid = Msgget(Ftok(argv[optind], 0). oflag);

17 exit(O):

18 }

Программа msgsnd

Программа msgsnd приведена в листинге 6.3. Она помещает в очередь одно сообщение заданной длины и типа.

Мы создаем указатель на структуру msgbuf общего вида, а затем выделяем место под реальную структуру (буфер записи) соответствующего размера, вызвав cal 1ос. Эта функция инициализирует буфер нулем.

Листинг 6.3. Помещение сообщения в очередь System V

svmsg/msgsnd.c

1 #include unpipc.h

2 int

3 mainCint argc. char **argv)

5 int mqid:

6 size t len;

7 long type;

8 struct msgbuf *ptr:

9 if (argc != 4)

10 err quit( usage: msgsnd <pathname> <#bytes> <type> ):



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