[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Блокировка ресурса - Пример

Здесь показан фрагмент программы для захвата и освобождения
ресурса. Разделяемым ресурсом является возможность вывода на
терминал. Обычно, если два процесса одновременно пишут на терминал,
то вывод обоих процессов смешивается на экране.
В этом примере программа использует семафоры, чтобы получить
исключительный доступ к терминалу и напечатать текстовую строку.
Если эта программа параллельно исполняется двумя процессами, то
процессы будут использовать терминал по очереди.
Этот фрагмент программы работает следующим образом:
14-17     Эти   командные   структуры   задают   операцию   захвата
          (вычесть 1) и операцию освобождения (добавить один). Флаг
          SEM_UNDO  используется   для  восстановления  предыдущего
          значения  семафора,   если  программа,   изменившая  его,
          ненормально  завершится.   Один   из   способов   вызвать
          ненормальное завершение  программы - нажать клавишу BREAK
          или DEL на терминале.
...       Отсутствующий код  содержит вызов  semget(2) для создания
          набора из  одного семафора  и semctl(2) для установки его
          значения в 1 командой SETVAL.
41-44     Здесь семафор  уменьшается на  1,  блокируя  (захватывая)
          ресурс.
45        Печатается сообщение  о  том,  что  ресурс  заблокирован.
          Заметьте, что  вывод не завершается переводом каретки, то
          есть это будет еще не вся строка вывода.
46        sleep(3C) изображает использование терминала. Кроме того,
          это освобождает процессор на время, пока процесс спит.
47-51     Печатается сообщение,  что  ресурс  освобождается.  Затем
          ресурс действительно  освобождается увеличением  значения
          семафора на 1.
Ниже приведена выдача двух экземпляров этой программы, запущенных в
фоновом режиме. Это может быть сделано одной командной строкой.
$ semdemo & semdemo &
12423
12424
$ [12423] locking[12423] unlocking
[12424] locking[12424] unlocking
[12423] locking[12423] unlocking
[12424] locking[12424] unlocking
[12423] locking[12423] unlocking
[12424] locking[12424] unlocking
[12423] locking[12423] unlocking
[12424] locking[12424] unlocking

Заметьте, что каждый процесс по очереди пишет полную строку на
стандартный вывод, являющийся сейчас разделяемым ресурсом.
Файл: semdemo.c
                    БЛОКИРОВКА РЕСУРСА - ПРИМЕР
 1       #include <unistd.h>
 2       #include <stdlib.h>
 3       #include <sys/types.h>
 4       #include <sys/ipc.h>
 5       #include <sys/sem.h>
 6       #include <stdio.h>
 7       #define  DUMMY  0
 8       #define  COUNT  4
 9
10       main(int argc, char *argv[])
11       {
   ...
14       static struct sembuf lock =
15       { 0, -1, SEM_UNDO };
16       static struct sembuf unlock =
17       { 0, 1, SEM_UNDO };
   ...
39       pid = getpid();
40       for (i = 0; i < COUNT; i++ ) {
41       if (semop(semid, &lock, 1) == -1) {
42       perror(argv[0]);
43       exit(3);
44       }
45       printf("[%d] locking\t", pid);
46       sleep(1);/* terminal output being used */
47       printf("[%d] unlocking\n", pid);
48       if (semop(semid, &unlock, 1) == -1) {
49       perror(argv[0]);
50       exit(4);
51       }
52       }
   ...
62       }