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

Программа semsetvalues

Программа semsetvalues

Программа semsetvalues (листинг 11.3) устанавливает значения всех семафоров набора.

Получение количества семафоров в наборе

11-15 После получения идентификатора семафора с помощью semget мы вызываем semctl с командой IPC_STAT, чтобы получить значения полей структуры semid_ds для данного семафора. Поле sem_nsems содержит нужную нам информацию о количестве семафоров в наборе.

Установка всех значений

19-24 Мы выделяем память под массив беззнаковых коротких целых, по одному элементу на каждый семафор набора, затем копируем полученные из командной строки значения в этот массив. Вызов semctl с командой SETALL позволяет установить все значения семафоров набора одновременно.

Листинг 11.3. Программа semsetvalues

//svsem/semsetvalues.с
1  #include "unpipc.h"
2  int
3  main(int argc, char **argv)
4  {
5   int semid, nsems, i;
6   struct semid_ds seminfo;
7   unsigned short *ptr;
8   union semun arg;
9   if (argc < 2)
10   err_quit("usage: semsetvalues <pathname> [ values … ]");
11  /* получение количества семафоров в наборе */
12  semid = Semget(Ftok(argv[1], 0), 0, 0);
13  arg.buf = &seminfo;
14  Semctl(semid, 0, IPC_STAT, arg);
15  nsems = arg.buf->sem_nsems;
16  /* получение значений из командной строки */
17  if (argc != nsems + 2)
18  err_quit("%d semaphores in set, %d values specified", nsems, argc-2);
19  /* выделение памяти под значения семафоров набора, помещение этих значений в новый массив */
20  ptr = Calloc(nsems, sizeof(unsigned short));
21  arg.array = ptr;
22  for (i = 0; i < nsems; i++)
23   ptr[i] = atoi(argv[i +2]);
24  Semctl(semid, 0, SETALL, arg);
25  exit(0);
26 }

Оглавление книги


Генерация: 1.292. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз