[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Операции над набором семафоров - Пример
Код, приведенный в этом примере, представляет собой часть той же
программы, что и предыдущий пример. Он демонстрирует, как
оперировать с двумя семафорами в наборе одновременно.
Фрагмент программы работает так:
... Имя команды определяет принтер, который нужно
использовать.
56-61 Две командные структуры установлены так, чтобы уменьшить
на 1 первый семафор и семафор, связанный с принтером с
номером prnnum. Заметьте, что используется флаг SEM_UNDO.
Вспомните, что номер семафора, над которым должна быть
выполнена операция, содержится в командной структуре.
62-66 Здесь выполняется операция над двумя семафорами
одновременно. Эта операция захватит принтер, который
должен быть использован. Другой процесс, исполняющий этот
же код, будет заблокирован до тех пор, пока значение
семафора не увеличится.
79-85 Командные структуры для обоих семафоров изменены так,
чтобы увеличить значение семафоров на 1. Оба семафора
изменяются "одновременно", т.е. ни один другой процесс не
получит управления в промежутке между их изменениями.
Эта программа демонстрируется так:
$ ln printer lineprntr
$ ln printer laseprntr
$ PRINTER1=/dev/tty05
$ PRINTER2=/tmp/xyz
$ export PRINTER1 PRINTER2
$ lineprntr data & lineprntr data & wait
3909
3910
1ABCDEFGHIJKLMNOPQRSTUVWXYZ
2ABCDEFGHIJKLMNOPQRSTUVWXYZ
3ABCDEFGHIJKLMNOPQRSTUVWXYZ
4ABCDEFGHIJKLMNOPQRSTUVWXYZ
1ABCDEFGHIJKLMNOPQRSTUVWXYZ
2ABCDEFGHIJKLMNOPQRSTUVWXYZ
3ABCDEFGHIJKLMNOPQRSTUVWXYZ
4ABCDEFGHIJKLMNOPQRSTUVWXYZ
$ ipcs -s
IPC status from /dev/kmem as of Tue Mar 3 11:18:53 1987
T ID KEY MODE OWNER GROUP
Semaphores:
s 100 0x7304001a --ra-ra-ra- jeg unixc
$ ipcrm -s 100
Файл: 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 {
...
17 struct sembuf operation[2];
...
56 operation[1].sem_num = prntnum;
57 operation[1].sem_op = ACQUIRE;
58 operation[1].sem_flg = SEM_UNDO;
59 operation[0].sem_num = 0;
60 operation[0].sem_op = ACQUIRE;
61 operation[0].sem_flg = SEM_UNDO;
62 if(semop(semid, operation, 2) == -1) {
63 sprintf(errmsg,"%s - ACQUIRE",argv[0]);
64 perror(errmsg);
65 exit(4);
66 }
...
79 operation[1].sem_op = RELEASE;
80 operation[0].sem_op = RELEASE;
81 if(semop(semid, operation, 2) == -1) {
82 sprintf(errmsg,"%s - RELEASE",argv[0]);
83 perror(errmsg);
84 exit(7);
85 }
...
87 }