Читать «UNIX: взаимодействие процессов» онлайн - страница 107
Уильям Ричард Стивенс
ПРИМЕЧАНИЕ
В листинге 5.12 мы привели решение с использованием очередей сообщений Posix, которое не требовало вызова fork. Для очередей сообщений Posix можно было обойтись одним процессом, поскольку они предусматривают уведомление о появлении нового сообщения с помощью сигнала. Для очередей System V такая возможность не предусмотрена, поэтому приходится порождать процесс, который будет блокироваться при вызове msgrcv.
Другим недостатком очередей сообщений System V по сравнению с сетевым интерфейсом является невозможность считывания сообщений из оперативной памяти (возможность, предоставляемая флагом MSG_PEEK для функций recv, recvfrom, recvmsg [24, с. 356]). Если бы такая возможность имелась, в предложенной только что схеме клиент-сервер (для обхода проблемы с select) можно было бы сделать работу более эффективной, указав флаг peek при вызове msgrcv дочерним процессом и записав 1 байт в канал при приходе сообщения, а родительский процесс тогда просто считывал бы сообщение из очереди.
6.10. Ограничения, накладываемые на очереди сообщений
Как отмечалось в разделе 3.8, на очереди сообщений часто накладываются системные oгрaничeния. В табл. 6.2 приведены значения этих oгрaничeний для двух конкретных реализаций. Первая колонка представляет собой традиционное имя System V для переменной ядра, хранящей это ограничение.
Таблица 6.2. Характерные значения ограничений для очередей сообщений
Имя | Описание | DUnix 4.0B | Solaris 2.6 |
---|---|---|---|
msgmax | Максимальное количество байтов в сообщении | 8192 | 2048 |
msgmnb | Максимальное количество байтов в очереди сообщений | 16384 | 4096 |
msgmni | Максимальное количество очередей сообщений в системе | 64 | 50 |
msgtlq | Максимальное количество сообщений в системе | 40 | 40 |
В этом разделе мы хотели показать типичные значения ограничений, чтобы помочь в планировании переносимых программ. При выполнении приложений, активно использующих очереди сообщений, обычно требуется настройка этих (или аналогичных) параметров ядра (что описано в разделе 3.8).
Пример
В листинге 6.21 приведен текст программы, которая определяет четыре ограничения, показанные в табл. 6.2.
Листинг 6.21. Определение системных ограничений для очередей сообщений System V
//svmsg/limits.c
1 #include "unpipc.h"
2 #define MAX_DATA 64*1024
3 #define MAX_NMESG 4096
4 #define MAX_NIDS 4096
5 int max_mesg;
6 struct mymesg {
7 long type;
8 char data[MAX_DATA];
9 } mesg;
10 int
11 main(int argc, char **argv)
12 {
13 int i, j, msqid, qid[MAX_NIDS];
14 /* определение максимального размера сообщения */
15 msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);