[<<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 }
...