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

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

Шрифт:
Листинг 11.7. Определение системных ограничений на семафоры System V

//svsem/limits.c

1 #include "unpipc.h"

2 /* максимальные величины, выше которых ограничение не проверяется */

3 #define MAX_NIDS 4096 /* максимальное количество идентификаторов семафоров */

4 #define MAX_VALUE 1024*1024 /* максимальное значение семафора */

5 #define MAX_MEMBERS 4096 /* максимальное количество семафоров в наборе */

6 #define MAX_NOPS 4096 /* максимальное количество операций за вызов semop */

7 #define MAX_NPROC Sysconf(_SC_CHILD_MAX)

8 int

9 main(int argc, char **argv)

10 {

11 int i, j, semid, sid[MAX_NIDS], pipefd[2];

12 int semmni, semvmx, semmsl, semmns, semopn, semaem, semume, semmnu;

13 pid_t *child;

14 union semun arg;

15 struct sembuf ops[MAX_NOPS];

16 /* сколько наборов с одним элементом можно создать? */

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

18 sid[i] = semget(IPC_PRIVATE, 1, SVSEM_MODE | IPC_CREAT);

19 if (sid[i] == –1) {

20 semmni = i;

21 printf("%d identifiers open at once\n", semmni);

22 break;

23 }

24 }

25 /* перед удалением находим максимальное значение, используя sid[0] */

26 for (j = 7; j < MAX_VALUE; j += 8) {

27 arg.val = j;

28 if (semctl(sid[0], 0, SETVAL, arg) == –1) {

29 semvmx = j – 8;

30 printf("max semaphore value = %d\n", semvmx);

31 break;

32 }

33 }

34 for (j = 0; j < i; j++)

35 Semctl(sid[j], 0, IPC_RMID);

36 /* определяем максимальное количество семафоров в наборе */

37 for (i = 1; i <= MAX_MEMBERS; i++) {

38 semid = semget(IPC_PRIVATE, i, SVSEM_MODE | IPC_CREAT);

39 if (semid == –1) {

40 semmsl = i-1;

41 printf("max of %d members per set\n", semmsl);

42 break;

43 }

44 Semctl(semid, 0, IPC_RMID);

45 }

46 /* сколько всего семафоров можно создать? */

47 semmns = 0;

48 for (i = 0; i < semmni; i++) {

49 sid[i] = semget(IPC_PRIVATE, semmsl, SVSEM_MODE | IPC_CREAT);

50 if (sid[i] == –1) {

51 /*

52 До этого в наборе было semmsl элементов,

53 но теперь мы уменьшаем количество элементов на 1 и смотрим.

54 не получится ли создать семафор

55 */

56 for (j = semmsl-1; j > 0; j--) {

57 sid[1] = semget(IPC_PRIVATE, j, SVSEM_MODE | IPC_CREAT);

58 if (sid[i] != –1) {

59 semmns += j;

60 printf("max of %d semaphores\n", semmns);

61 Semctl(sid[i], 0, IPC_RMID);

62 goto done;

63 }

64 }

65 err_quit("j reached 0, semmns = %d", semmns);

66 }

67 semmns += semmsl;

68 }

69 printf("max of %d semaphores\n", semns);

70 done:

71 for (j = 0; j < i; j++)

72 Semctl(sid[j], 0, IPC_RMID);

73 /* определяем количество операций за вызов semop */

  • Читать дальше
  • 1
  • ...
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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