Пример
Пример
Программа в листинге 14.5 определяет значения четырех ограничений, приведенных в табл. 14.1.
Листинг 14.5. Определение системных ограничений на разделяемую память
//svshm/limits.c
1 #include "unpipc.h"
2 #define MAX_NIDS 4096
3 int
4 main(int argc, char **argv)
5 {
6 int i, j, shmid[MAX_NIDS];
7 void *addr[MAX_NIDS];
8 unsigned long size;
9 /* проверка максимального количества открываемых идентификаторов */
10 for (i = 0; i <= MAX_NIDS; i++) {
11 shmid[i] = shmget(IPC_PRIVATE, 1024, SVSHM_MODE | IPC_CREAT);
12 if (shmid[i]== –1) {
13 printf("%d identifiers open at once ", i);
14 break;
15 }
16 }
17 for (j = 0; j < i; j++)
18 Shmctl(shmid[j], IPC_RMID, NULL);
19 /* определяем максимальное количество подключаемых сегментов */
20 for (i=0;i <= MAX_NIDS; i++) {
21 shmid[i] = Shmget(IPC_PRIVATE, 1024, SVSHM_MODE | IPC_CREAT);
22 addr[i] = shmat(shmid[i], NULL, 0);
23 if (addr[i] == (void *) –1) {
24 printf("%d shared memory segments attached at once ", i);
25 Shmctl(shmid[i], IPC_RMID, NULL); /* удаляем неудачно подключенный сегмент */
26 break;
27 }
28 }
29 for (j = 0; j < i; j++) {
30 Shmdt(addr[j]);
31 Shmcfl(shmid[j], IPC_RMID, NULL);
32 }
33 /* проверка минимального размера сегмента */
34 for (size = 1; ; size++) {
35 shmid[0] = shmget(IPC_PRIVATE, size, SVSHM_MODE | IPC_CREAT);
36 if (shmid[0] != –1) { /* выход при успешном создании */
37 printf("minimum size of shared memory segment = %lu ", size);
38 Shmctl(shmid[0], IPC_RMID, NULL);
39 break;
40 }
41 }
42 /* определение максимального размера сегмента */
43 for (size = 65536; ; size += 4096) {
44 shmid[0] = shmget(IPC_PRIVATE, size, SVSHM_MODE | IPC_CREAT);
45 if (shmid[0] == –1) { /* выход при ошибке */
46 printf("maximum size of shared memory segment = %lu ", size-4096);
47 break;
48 }
49 Shmctl(shmid[0], IPC_RMID, NULL);
50 }
51 exit(0);
52 }
Запустив эту программу в Digital Unix 4.0B, увидим:
alpha % limits
127 identifiers open at once
32 shared memory segments attached at once
minimum size of shared memory segment = 1
maximum size of shared memory segment = 4194304
Причина, по которой в табл. 14.1 приведено значение 128 для числа идентификаторов, а наша программа выводит значение 127, заключается в том, что один сегмент разделяемой памяти всегда используется системным демоном.
Данный текст является ознакомительным фрагментом.