Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

Стивенс Уильям Ричард

Шрифт:

ПРИМЕЧАНИЕ

В листинге 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);

16 mesg.type = 1;

17 for (i = MAX_DATA; i > 0; i –= 128) {

18 if (msgsnd(msqid, &mesg, i, 0) == 0) {

19 printf("maximum amount of data per message = %d\n", i);

20 max_mesg = i;

21 break;

22 }

23 if (errno != EINVAL)

24 err_sys("msgsnd error for length %d", i);

25 }

26 if (i == 0)

27 err_quit("i == 0");

28 Msgct(lmsqid, IPC_RMID, NULL);

29 /* количество сообщений в очереди */

30 mesg.type = 1;

31 for (i = 8; i <= max_mesg; i *= 2) {

32 msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);

33 for (j = 0; j < MAX_NMESG; j++) {

34 if (msgsnd(msqid, &mesg, i, IPC_NOWAIT) != 0) {

35 if (errno == EAGAIN)

36 break;

37 err_sys("msgsnd error, i = %d, j = %d", i, j);

38 break;

39 }

40 }

41 printf("%d %d-byte messages were placed onto queue,", j, i);

42 printf(" %d bytes total\n". i*j);

43 Msgctl(msqid, IPC_RMID, NULL);

44 }

45 /* максимальное количество идентификаторов */

46 mesg.type = 1;

47 for (i = 0; i <= MAX_NIDS; i++) {

48 if ((qid[i] = msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT)) == –1) {

49 printf("%d identifiers open at once\n", i);

50 break;

  • Читать дальше
  • 1
  • ...
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: