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