Читаем UNIX: взаимодействие процессов полностью

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()\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  /* создание одного набора с максимальным количеством семафоров */

Перейти на страницу:

Все книги серии Мастер-класс

Секреты резьбы по дереву
Секреты резьбы по дереву

Изделия из древесины и материалов, имитирующих ее текстуру, привычным образом окружают нас в повседневной жизни, поэтому мы относимся к ней как к чему-то обыденному. Но как только ее коснется умелая рука мастера резьбы по дереву, рождается произведение искусства и раскрываются такие качества древесины, как богатая фактура, разнообразие цветов, особая теплота. Эта книга поможет читателю открыть для себя удивительный мир творчества и познать секреты резьбы по дереву. Автор надеется, что начинающие резчики найдут в ней интересный и полезный материал, который позволит им стать мастерами. В приложении представлены рисунки орнаментов и различных узоров, которые на первых порах можно копировать, а по мере приобретения навыка на их основе разрабатывать свои образцы.

Галина Алексеевна Серикова

Сделай сам / Хобби и ремесла / Руководства / Дом и досуг / Словари и Энциклопедии

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных