[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Создание набора семафоров - Пример

Этот пример использует набор семафоров для управления всеми
принтерами, трактуемыми как общий ресурс печати. Этот код
показывает, как создать и инициализировать набор из более чем
одного семафора.
Эта программа использует следующий файл заголовка:
printer.h

1       #define   DUMMY   0
2       #define   NUMPR   2/* number of printers */
3       #define   ACQUIRE     -1
4       #define   RELEASE      1

Фрагмент программы работает так:
15        Объявление   массива,    содержащего    инициализационные
          значения всех семафоров в наборе.

...       Переменные  среды  PRINTER1  и  PRINTER2  содержат  имена
          "принтеров", ассоциированных  с индексами  1 и  2  набора
          семафоров. Эти  "принтеры" могут  быть как файлами, так и
          устройствами.

31        Формирование  ключа   на  основании   имени  программы  и
          буквы s. Так как два имени программы laserprnt и lineprnt
          представляют собой ссылки на один и тот же файл, ftok(3),
          используя эти  имена в качестве параметров, выдает одно и
          то же устройство и номер инода (inode).

32-35     Здесь   создается    набор   из    NUMPR + 1   семафоров.
          Дополнительный семафор  с индексом  0 управляет  ресурсом
          печати в целом.

45-54     Первый  семафор  в  наборе  инициализируется  количеством
          принтеров в  общем  ресурсе  печати.  Остальные  семафоры
          инициализируются
          в  1.   Заметьте,  что   второй  аргумент   semctl(2)  не
          используется.

Файл: printer.c
                СОЗДАНИЕ НАБОРА СЕМАФОРОВ - ПРИМЕР
 1 #include <stdlib.h>
 2 #include <string.h>
 3 #include <unistd.h>
 4 #include <fcntl.h>
 5 #include <sys/types.h>
 6 #include <sys/ipc.h>
 7 #include <sys/sem.h>
 8 #include <stdio.h>
 9 #include "printer.h"
10
11 main(int argc, char *argv[])
12 {
 ...
14    key_t ipckey;
15    ushort initial[NUMPR + 1], prntnum;
 ...
31    ipckey = ftok(argv[0], 's');
32    if ((semid = semget(ipckey, NUMPR + 1,
33     IPC_CREAT | IPC_EXCL | 0666)) != -1) {
34      creator = 1;
35    }
 ...
45    if(creator) { /* initialize semaphore set */
46      initial[0] = NUMPR;
47      for (n = 1; n <= NUMPR; n++)
48          initial[n] = 1;
49      if(semctl(semid,DUMMY,SETALL,initial) == -1) {
50          sprintf(errmsg,"%s - SETALL", argv[0]);
51          perror(errmsg);
52          exit(3);
53      }
54    }
 ...