Вход/Регистрация
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);

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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