Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

Стивенс Уильям Ричард

Шрифт:
Листинг 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 }

Программа semops

В листинге 11.5 приведен текст программы semops, позволяющей выполнять последовательность действий над набором семафоров.

Параметры командной строки

7-19 Параметр –n соответствует установленному флагу IPC_NOWAIT для каждой операции, а параметр –u аналогичным образом позволяет указать для каждой операции флаг SEM_UNDO. Обратите внимание, что функция semop позволяет указывать свой набор флагов для каждого элемента структуры sembuf (то есть для каждой из операций в отдельности), но для простоты мы в нашей программе задаем одинаковые флаги для всех операций.

Выделение памяти под набор операций

20-29 После открытия семафора вызовом semget мы выделяем память под массив структур sembuf, по одному элементу на каждую операцию из командной строки. В отличие от предыдущих двух программ эта позволяет пользователю задать меньше команд, чем имеется семафоров в наборе.

Выполнение операций

30 Вызов semop выполняет последовательность операций над семафорами набора.

Листинг 11.5. Программа semops

//svsem/semops.c

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 int с, i, flag, semid, nops;

6 struct sembuf *ptr;

7 flag = 0;

8 while ((c = Getopt(argc, argv, "nu")) != –1) {

9 switch (c) {

10 case 'n':

11 flag |= IPC_NOWAIT; /* для всех операций */

12 break;

13 case 'u':

14 flag |= SEM_UNDO; /* для всех операций */

15 break;

16 }

17 }

18 if (argc = optind < 2) /* argc – optind = количество оставшихся аргументов */

19 err_quit("usage: semops [ –n ] [ –u ] <pathname> operation …");

20 semid = Semget(Ftok(argv[optind], 0), 0, 0);

21 optind++;

22 nops = argc – optind;

23 /* выделение памяти под операции, сохранение их в массиве и выполнение */

24 ptr = Calloc(nops, sizeof(struct sembuf));

25 for (i = 0; i < nops; i++) {

26 ptr[i].sem_num = i;

27 ptr[i].sem_op = atoi(argv[optind + i]); /* <0, 0, or >0 */

28 ptr[i].sem_flg = flag;

29 }

30 Semop(semid, ptr, nops);

31 exit(0);

32 }

Примеры

Теперь мы продемонстрируем работу пяти приведенных выше программ и исследуем некоторые свойства семафоров System V:

solaris % touch /tmp/rich

solaris % semcreate –e /tmp/rich 3

solaris % semsetvalues /tmp/rich 1 2 3

solaris % semgetvalues /tmp/rich

  • Читать дальше
  • 1
  • ...
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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