7    err_quit("usage: semrmid pathname"):

8   semid = Semget(Ftok(argv[1], 0), 0, 0);

9   Semctl(semid, 0, IPC_RMID);

10  exit(0);

11 }

<p>Программа semsetvalues</p>

Программа 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 }

<p>Программа semgetvalues</p>

В листинге 11.4 приведен текст программы semgetvalues, которая получает и выводит значения всех семафоров набора.

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

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

Получение всех значений

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

Листинг 11.4. Программа semgetvalues

//svsem/semgetvalues.c

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: semgetvalues pathname");

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  ptr = Calloc(nsems, sizeof(unsigned short));

18  arg.array = ptr;

19  /* получаем и выводим значения семафоров */

20  Semctl(semid, 0, GETALL, arg);

21  for (i = 0; i nsems; i++)

22   printf("semval[%d] = %d\n", i, ptr[i]);

23  exit(0);

24 }

<p>Программа semops</p>
Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже