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

Программа semgetvalues

Программа semgetvalues

В листинге 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] = %dn", i, ptr[i]);
23  exit(0);
24 }

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


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