Книга: UNIX: взаимодействие процессов

Пример

Пример

Программа в листинге 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 oncen", 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 oncen", 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 = %lun", 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 = %lun", 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, заключается в том, что один сегмент разделяемой памяти всегда используется системным демоном.

Оглавление книги

Оглавление статьи/книги

Генерация: 0.053. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз