на главную | войти | регистрация | DMCA | контакты | справка | donate |      

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


моя полка | жанры | рекомендуем | рейтинг книг | рейтинг авторов | впечатления | новое | форум | сборники | читалки | авторам | добавить



Пример

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


14.7. Ограничения, накладываемые на разделяемую память | UNIX: взаимодействие процессов | Листинг 14.5. Определение системных ограничений на разделяемую память