Чтение онлайн

на главную - закладки

Жанры

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

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

Шрифт:

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\n", 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\n", 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\n", 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\n", 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\n", semume);

148 break;

149 }

150 }

151 Semctl(semid, 0, IPC_RMID);

152 exit(0);

153 }

11.8. Резюме

У семафоров System V имеются следующие отличия от семафоров Posix:

1. Семафоры System V представляют собой набор значений. Последовательность операций над набором семафоров либо выполняется целиком, либо не выполняется вовсе.

2. К любому элементу набора семафоров могут быть применены три операции: проверка на нулевое значение, добавление некоторого значения к текущему и вычитание некоторого значения из текущего (в предположении, что значение остается неотрицательным). Для семафоров Posix определены только операции увеличения и уменьшения значения семафора на 1 (в предположении, что значение остается неотрицательным).

3. Создание семафора System V имеет некоторую особенность, заключающуюся в необходимости выполнения двух вызовов для создания и инициализации семафора, что может привести к ситуации гонок.

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

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Товарищ "Чума" 6

lanpirot
6. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 6

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

На границе империй. Том 8

INDIGO
12. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8

На границе империй. Том 10. Часть 2

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 10. Часть 2

Вперед в прошлое 7

Ратманов Денис
7. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 7

Ожерелье Странника

Хаггард Генри Райдер
Приключения:
исторические приключения
7.50
рейтинг книги
Ожерелье Странника

Древесный маг Орловского княжества 10

Павлов Игорь Васильевич
10. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 10

Шайтан Иван 4

Тен Эдуард
4. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
Шайтан Иван 4

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

Принц Ардена

Анри Софи
Любовные романы:
исторические любовные романы
5.00
рейтинг книги
Принц Ардена

Катриона

Стивенсон Роберт Льюис
Приключения:
исторические приключения
8.62
рейтинг книги
Катриона

Первый среди равных. Книга VI

Бор Жорж
6. Первый среди Равных
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VI