11.6. Блокирование файлов

11.6. Блокирование файлов

С помощью семафоров System V можно реализовать еще одну версию функций my_lock и my_unlock из листинга 10.10. Новый вариант приведен в листинге 11.6.

Листинг 11.6. Блокировка файлов с помощью семафоров System V

//lock/locksvsem.c

1  #include "unpipc.h"

2  #define LOCK_PATH "/tmp/svsemlock"

3  #define MAX_TRIES 10

4  int semid, initflag;

5  struct sembuf postop, waitop;

6  void

7  my_lock (int fd)

8  {

9   int oflag, i;

10  union semun arg;

11  struct semid_ds seminfo;

12  if (initflag == 0) {

13   oflag = IPC_CREAT | IPC_EXCL | SVSEM_MODE;

14   if ((semid = semget(Ftok(LOCK_PATH, 0), 1, oflag)) >= 0) {

15    /* этот процесс создал семафор первым, он же его и инициализирует */

16    arg.val = 1;

17    Semctl(semid, 0, SETVAL, arg);

18   } else if (errno == EEXIST) {

19    /* семафор создан другим процессом, убедимся, что он проинициализирован */

20    semid = Semget(Ftok(LOCK_PATH, 0), 1, SVSEM_MODE);

21    arg.buf = &seminfo;

22    for (i = 0; i < MAX_TRIES; i++) {

23     Semctl(semid, 0, IPC_STAT, arg);

24     if (arg.buf->sem_otime != 0)

25      goto init;

26     sleep(1);

27    }

28    err_quit("semget OK, but semaphore not initialized");

29   } else

30    err_sys("semget error");

31 init:

32   initflag = 1;

33   postop.sem_num = 0; /* инициализируем две структуры semop()*/

34   postop.sem_op = 1;

35   postop.sem_flg = SEM_UNDO;

36   waitop.sem_num = 0;

37   waitop.sem_op = –1;

38   waitop.sem_flg = SEM_UNDO;

39  }

40  Semop(semid, &waitop, 1); /* уменьшим на 1 */

41 }

42 void

43 my_unlock(int fd)

44 {

45  Semop(semid, &postop, 1); /* увеличим на 1*/

46 }

Попытка исключающего создания

13-17 Нам нужно гарантировать, что только один процесс проинициализирует семафор, поэтому при вызове semget мы указываем флаги IPC_CREAT | IPC_EXCL. Если этот вызов оказывается успешным, процесс вызывает semctl для инициализации семафора значением 1. Если мы запустим несколько процессов одновременно и все они вызовут функцию my_lock, только один из них создаст семафор (предполагается, что он еще не существует) и проинициализирует его.

Семафор уже существует, мы его открываем

18-20 Если первый вызов semget возвращает ошибку EEXIST, процесс вызывает semget еще раз, но уже без флагов IPC_CREAT и IPC_EXCL.

Ожидание инициализации семафора

21-28 В этой программе возникает такая же ситуация гонок, как и обсуждавшаяся в разделе 11.2, когда мы говорили об инициализации семафоров System V вообще. Для исключения такой ситуации все процессы, которые обнаруживают, что семафор уже создан, вызывают semctl с командой IPC_STAT, проверяя значение sem_otime данного семафора. Когда это значение становится ненулевым, мы можем быть уверены, что создавший семафор процесс проинициализировал его и вызвал semop (этот вызов находится в конце функции) успешно. Если значение этого поля оказывается нулевым (что должно происходить крайне редко), мы приостанавливаем выполнение процесса на одну секунду вызовом sleep, а затем повторяем попытку. Число попыток мы ограничиваем, чтобы процесс не «заснул» навсегда.

Инициализация структур sembuf

33-38 Как отмечалось ранее, конкретный порядок полей структуры sembuf зависит от реализации, поэтому статически инициализировать ее нельзя. Вместо этого мы выделяем место под две такие структуры и присваиваем значения их полям во время выполнения программы, когда процесс вызывает my_lock в первый раз. При этом мы указываем флаг SEM_UNDO, чтобы ядро сняло блокировку, если процесс завершит свою работу, не сняв ее самостоятельно (см. упражнение 10.3).

Создание семафора при первой необходимости реализовать довольно просто (все процессы пытаются создать семафор, игнорируя ошибку, если он уже существует), но удаление семафора после завершения работы всех процессов организовать гораздо сложнее. В случае демона печати, использующего файл с последовательным номером для упорядочения заданий печати, удалять семафор нет необходимости. Но в других приложениях может возникнуть необходимость удалить семафор при удалении соответствующего файла. В этом случае лучше пользоваться блокировкой записи, чем семафором.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Блокирование активного содержимого

Из книги Компьютер на 100. Начинаем с Windows Vista автора Зозуля Юрий

Блокирование активного содержимого Веб-страницы могут содержать не только тексты и рисунки, но и специальные программные модули, расширяющие возможности веб-страниц и позволяющие сделать их интерактивными. Однако в то же время этими средствами могут воспользоваться


Блокирование объектов

Из книги ArchiCAD 11 автора Днепров Александр Г

Блокирование объектов В заключение главы, посвященной редактированию объектов, упомяну о механизме, позволяющем избежать случайного изменения объектов или их свойств. В ArchiCAD имеется способ заблокировать необходимые объекты от редактирования. Для этого следует


Блокирование объектов

Из книги ArchiCAD. Начали! автора Орлов Андрей Александрович

Блокирование объектов В заключение главы, посвященной редактированию объектов, упомянем о механизме, позволяющем избежать случайного изменения объектов или их свойств. В ArchiCAD есть способ защитить необходимые объекты от редактирования. Для этого следует выделить их и


17.4.7. Блокирование нежелательных корреспондентов

Из книги Самоучитель работы на компьютере автора Колисниченко Денис Николаевич

17.4.7. Блокирование нежелательных корреспондентов Если вам надоел какой-то корреспондент и вы больше не хотите получать от него письма, можете внести его в список блокируемых. Для этого щелкните на любом письме от этого корреспондента и выполните команду меню Сообщение,


11. Блокирование Tor и как с ним бороться

Из книги Установка и настройка Tor автора Стручков Юрий

11. Блокирование Tor и как с ним бороться Система Tor позволяет скрывать от провайдера конечные (целевые) адреса, тем самым прорывая возможную блокаду доступа к заблокированным им сетевым ресурсам. Также система Tor скрывает от целевых ресурсов адрес отправителя, тем самым


9.2. Блокирование записей и файлов

Из книги Системное программирование в среде Windows автора Харт Джонсон М

9.2. Блокирование записей и файлов Ядро Unix никак не интерпретирует содержимое файла, оставляя всю обработку записей приложениям, работающим с этим файлом. Тем не менее для описания предоставляемых возможностей используется термин «блокировка записей». В


9.8. Блокирование файлов

Из книги Linux программирование в примерах автора Роббинс Арнольд

9.8. Блокирование файлов Стандарт Posix.1 гарантирует, что если функция open вызывается с флагами O_CREAT (создать файл, если он еще не существует) и O_EXCL (исключающее открытие), функция возвращает ошибку, если файл уже существует. Более того, проверка существования файла и его


9.9. Блокирование в NFS

Из книги Дело о реформе копирайта автора Энгстрём Кристиан

9.9. Блокирование в NFS Аббревиатура NFS расшифровывается как Network File System (сетевая файловая система); эта система подробно обсуждается в главе 29 [22]. Блокировка записей fcntl представляет собой расширение NFS, поддерживаемое большинством ее реализаций. Обслуживается эта


10.7. Блокирование файлов

Из книги Операционная система UNIX автора Робачевский Андрей М.

10.7. Блокирование файлов Вернемся к задаче о порядковом номере из главы 9. Здесь мы напишем новые версии функций my_lock и my_unlосk, использующие именованные семафоры Posix. В листинге 10.10 приведен текст этих функций.Листинг 10.10. Блокирование файла с помощью именованных семафоров


11.6. Блокирование файлов

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

11.6. Блокирование файлов С помощью семафоров System V можно реализовать еще одну версию функций my_lock и my_unlock из листинга 10.10. Новый вариант приведен в листинге 11.6.Листинг 11.6. Блокировка файлов с помощью семафоров System V//lock/locksvsem.c1  #include "unpipc.h"2  #define LOCK_PATH "/tmp/svsemlock"3  #define MAX_TRIES


Блокирование файлов

Из книги автора

Блокирование файлов В системах, допускающих одновременное выполнение нескольких процессов, особую актуальность приобретает проблема координации и синхронизации доступа к разделяемым (совместно используемым) объектам, например файлам.В Windows имеется возможность


14.2.3. Блокирование BSD: flock()

Из книги автора

14.2.3. Блокирование BSD: flock() 4.2 BSD представило свой собственный механизм блокировки, flock()[155]. Функция объявлена следующим образом:#include <sys/file.h> /* Обычный */int flock(int fd, int operation);Дескриптор fd представляет открытый файл. Имеются следующие операции:LOCK_SH  Создает совместную


Цензура и блокирование интернета

Из книги автора

Цензура и блокирование интернета http://habrahabr.ru/post/155295/Этапы введения цензуры в интернете 2007–201218 октября 2012 в 19:22.Копирайт: Dura Lex.Глядя на то, как в отдельных областях России блокируется youtube и ubuntu, я не мог не вспомнить, как Кристиан Энгстрём и Рик Фальквинге в брошюре,


Блокирование доступа к файлу

Из книги автора

Блокирование доступа к файлу Традиционно архитектура файловой подсистемы UNIX разрешает нескольким процессам одновременный доступ к файлу для чтения и записи. Хотя операции записи и чтения, осуществляемые с помощью системных вызовов read(2) или write(2), являются атомарными, в