Пример

Пример

Программа в листинге 11.7 позволяет определить ограничения, приведенные в табл. 11.1.

Листинг 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 ", 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 ", 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 ", 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 ", 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 ", semns);

70  done:

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

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

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

74   semid = Semget(IPC_PRIVATE, semmsl, SVSEM_MODE | IPC_CREAT);

75   for (i = 1; i <= MAX_NOPS; i++) {

76    ops[i-1].sem_num = i-1;

77    ops[i-1].sem_op = 1;

78    ops[i-1].sem_flg = 0;

79    if (semop(semid, ops, i) += –1) {

80     if (errno != E2BIG)

81      err_sys("expected E2BIG from semop");

82     semopn = i-1;

83     printf("max of %d operations per semop() ", semopn);

84     break;

85    }

86   }

87   Semctl(semid, 0, IPC_RMID);

88   /* определение максимального значения semadj */

89   /* создание одного набора с одним семафором */

90   semid = Semget(IPC_PRIVATE, 1, SVSEM_MODE | IPC_CREAT);

91   arg.val = semvmx;

92   Semctl(semid, 0, SETVAL, arg); /* устанавливаем значение на максимум */

93   for (i = semvmx-1; i > 0; i--) {

94    ops[0].sem_num = 0;

95    ops[0].sem_op = –i;

96    ops[0].sem_flg = SEM_UNDO;

97    if (semop(semid, ops, 1) != –1) {

98     semaem = i;

99     printf("max value of adjust-on-exit = %d ", semaem);

100    break;

101   }

102  }

103  Semctl(semid, 0, IPC_RMID);

104  /* определение максимального количества структур UNDO */

105  /* создаем один набор с одним семафором и инициализируем нулем */

106  semid = Semget(IPC_PRIVATE, 1, SVSEM_MODE | IPC_CREAT);

107  arg.val = 0;

108  Semctl(semid, 0, SETVAL, arg); /* установка значения семафора в 0 */

109  Pipe(pipefd);

110  child = Malloc(MAX_NPROC * sizeof(pid_t));

111  for (i = 0; i < MAX_NPROC; i++) {

112   if ((child[i] = fork()) == –1) {

113    semmnu = i – 1;

114    printf("fork failed, semmnu at least %d ", semmnu);

115    break;

116   } else if (child[i] == 0) {

117    ops[0].sem_num = 0; /* дочерний процесс вызывает semop() */

118    ops[0].sem_op = 1;

119    ops[0].sem_flg = SEM_UNDO;

120    j = semop(semid, ops, 1); /* 0 в случае успешного завершения. –1 – в случае ошибки */

121    Write(pipefd[1], &j, sizeof(j));

122    sleep(30); /* ожидает завершения родительским процессом */

123    exit(0); /* на всякий случай */

124   }

125   /* родительский процесс считывает результат вызова semop() */

126   Read(pipefd[0], &j, sizeof(j));

127   if (j == –1) {

128    semmnu = i;

129    printf("max # undo structures = %d ", semmnu);

130    break;

131   }

132  }

133  Semctl(semid, 0, IPC_RMID);

134  for (j = 0; j <= i && child[j] > 0; j++)

135   Kill(child[j], SIGINT);

136  /* определение максимального количества записей корректировки на процесс */

137  /* создание одного набора с максимальным количеством семафоров */

138  semid = Semget(IPC_PRIVATE, semmsl, SVSEM_MODE | IPC_CREAT);

139  for (i = 0; i < semmsl; i++) {

140   arg.val = 0;

141   Semctl(semid, i, SETVAL, arg); /* установка значения семафора в 0 */

142   ops[i].sem_num = i;

143   ops[i].sem_op = 1; /* добавляем 1 к значению семафора */

144   ops[i].sem_flg = SEM_UNDO;

145   if (semop(semid, ops, i+1) == –1) {

146    semume = i;

147    printf("max # undo entries per process = %d ", semume);

148    break;

149   }

150  }

151  Semctl(semid, 0, IPC_RMID);

152  exit(0);

153 }

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Пример

Из книги Обработка событий в С++ автора Клюев Александр

Пример В примере создаются два класса обработчик и инициатор события, устанавливается связь между ними и иллюстрируется обработка события в нескольких объектах одновременно:#include "stdafx.h" #include "sigslot.h"struct EventRaiser { // источник события signal<const char*> event; // const char* – тип аргумента.


25.5. Пример

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

25.5. Пример Для закрепления материала этой главы ниже приводится пример приложения, в котором задействовано большинство функциональных возможностей qdbm. Подразумевается, что в результате выполнения этого приложения будет создана простая база данных телефонных номеров,


27.1.1. Пример

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

27.1.1. Пример В главе 8 был представлен пример использования обычной разделяемой библиотеки. Библиотеку libhello.so, которую нам удалось создать, можно загружать во время выполнения. Программа loadhello загружает libhello.so динамически и вызывает функцию print_hello, которая находится в


Пример 10-27. Простой пример сравнения строк

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Пример 10-27. Простой пример сравнения строк #!/bin/bash# match-string.sh: простое сравнение строкmatch_string (){ MATCH=0 NOMATCH=90 PARAMS=2 # Функция требует два входных аргумента. BAD_PARAMS=91 [ $# -eq $PARAMS ] || return $BAD_PARAMS case "$1" in "$2") return $MATCH;; * ) return $NOMATCH;; esac}a=oneb=twoc=threed=twomatch_string $a # неверное число


Пример 12-20. Пример форматирования списка файлов в каталоге

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Пример 12-20. Пример форматирования списка файлов в каталоге #!/bin/bash# За основу сценария взят пример "man column".(printf "PERMISSIONS LINKS OWNER GROUP SIZE DATE TIME PROG-NAME " ; ls -l | sed 1d) | column -t# Команда "sed 1d" удаляет первую строку, выводимую командой ls,#+ (для локали "С" это строка: "total N",#+ где "N" -- общее


Пример 12-45. Пример работы с m4

Из книги UNIX — универсальная среда программирования автора Пайк Роб

Пример 12-45. Пример работы с m4 #!/bin/bash# m4.sh: Демонстрация некоторых возможносией макропроцессора m4# Строкиstring=abcdA01echo "len($string)" | m4 # 7echo "substr($string,4)" | m4 # A01echo "regexp($string,[0-1][0-1],&Z)" | m4 # 01Z# Арифметикаecho "incr(22)" | m4 # 23echo "eval(99 / 3)" | m4 #


Пример 24-2. Еще один пример проверки аргументов с помощью "И-списков"

Из книги автора

Пример 24-2. Еще один пример проверки аргументов с помощью "И-списков" #!/bin/bashARGS=1 # Ожидаемое число аргументов.E_BADARGS=65 # Код завершения, если число аргументов меньше ожидаемого.test $# -ne $ARGS && echo "Порядок использования: `basename $0` $ARGS аргумент(а)(ов)" && exit $E_BADARGS# Если


Пример 25-8. Пример реализации алгоритма Решето Эратосфена

Из книги автора

Пример 25-8. Пример реализации алгоритма Решето Эратосфена #!/bin/bash# sieve.sh# Решето Эратосфена# Очень старый алгоритм поиска простых чисел.# Этот сценарий выполняется во много раз медленнее# чем аналогичная программа на C.LOWER_LIMIT=1 # Начиная с 1.UPPER_LIMIT=1000 # До 1000.# (Вы можете


9.4. Пример

Из книги автора

9.4. Пример В архитектуре x86 есть инструкции, определяющие позицию старшего и младшего значащих битов в слове. Процессор выполняет эти инструкции очень быстро. С другой стороны, чтобы сделать то же самое на языке С, потребуется написать цикл с операциями побитового


Пример

Из книги автора

Пример В листинге 11.1[1] показана простая программа, вызывающая функцию gethostbyname для любого числа аргументов командной строки и выводящая всю возвращаемую информацию.Листинг 11.1. Вызов функции и вывод возвращаемой информации//names/hostent.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5  char


Пример

Из книги автора

Пример Сначала приведем пример с Ipv4:freebsd % traceroute www.unpbook.comtraceroute to www.unpbook.com (206.168.112.219): 30 hops max. 24 data bytes1 12.106.32.1 (12.106.32.1) 0.799 ms 0.719 ms 0.540 ms2 12.124.47.113 (12.124.47.113) 1.758 ms 1.760 ms 1.839 ms3 gbr2-p27.sffca.ip.att.net (12.123.195.38) 2.744 ms 2.575 ms 2.648 ms4 tbr2-p012701.sffca.ip.att.net (12.122.11.85) 3.770 ms 3.689 ms 3.848 ms5 gbr3-p50.dvmco.ip.att.net (12.122.2.66) 26.202 ms 26.242 ms


Пример

Из книги автора

Пример Сначала мы запустим нашу программу с аргументом командной строки -0 и убедимся, что сервер имен отвечает на приходящие дейтаграммы, не содержащие контрольной суммы. Мы также задаем флаг -v.macosx # udpcksum -i en1 -0 -v bridget.rudoff.com domaindevice = en1local net = 172.24.37.64. netmask = 255.255.255.224cmd = udp and src host