Читать «UNIX: взаимодействие процессов» онлайн - страница 108
Уильям Ричард Стивенс
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;
51 }
52 }
53 for (j = 0; j < i; j++)
54 Msgctl(qid[j], IPC_RMID, NULL);
55 exit(0);
56 }
Определение максимального размера сообщения
14-28 Для определения максимально возможного размера сообщения мы пытаемся послать сообщение, в котором будет 65 536 байт данных, и если эта попытка оказывается неудачной, уменьшаем этот объем до 65 408, и т.д., пока вызов msgsnd не окажется успешным.
Сколько сообщений различного размера может быть помещено в очередь?
29-44 Теперь мы начинаем с 8-байтовых сообщений и смотрим, сколько их поместится в очередь. После определения этого ограничения мы удаляем очередь (сбрасывая все эти сообщения) и повторяем процедуру с 16-байтовыми сообщениями. Мы повторяем это до тех пор, пока не будет достигнут максимальный размер сообщения из первого пункта. Ожидается, что небольшие сообщения будут превышать ограничение по количеству сообщений в очереди, а большие — ограничение по количеству байтов.
Сколько идентификаторов может быть открыто одновременно?
45-54 Обычно есть системное ограничение на количество одновременно открытых идентификаторов. Оно определяется непосредственно созданием очередей до тех пор, пока не произойдет ошибка при вызове msgget.
Запустим эту программу сначала в Solaris 2.6, а затем в Digital Unix 4.0B, и результаты подтвердят приведенные в табл. 6.2 величины:
solaris % limits
maximum amount of data per message = 2048
40 8-byte messages were placed on queue, 320 bytes total
40 16-byte messages were placed on queue, 640 bytes total
40 32-byte messages were placed on queue, 1280 bytes total
40 64-byte messages were placed on queue, 2560 bytes total
32 128-byte messages were placed on queue, 4096 bytes total
16 256-byte messages were placed on queue, 4096 bytes total
8 512-byte messages were placed on queue, 4096 bytes total
4 1024-byte messages were placed on queue, 4096 bytes total
2 2048-byte messages were placed on queue, 4096 bytes total