Хрестоматия по программированию на Си в Unix




Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 2


F_SETLKW

Устанавливает или снимает замок, описываемый структурой lock. При этом, если замок на область, пересекающуюся с указанной уже кем-то установлен, то сперва дождаться снятия этого замка.

Пытаемся | Нет Уже есть уже есть поставить | чужих замок замок замок на | замков на READ на WRITE -----------|-------------------------------------------------------------- READ | читать читать ждать;запереть;читать WRITE | записать ждать;запереть;записать ждать;запереть;записать UNLOCK | отпереть отпереть отпереть

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

    Запрашиваем возможность установить замок, описанный в lock.

  • Если мы можем установить такой замок (не заперто никем), то в структуре lock

    поле l_type становится равным F_UNLCK и поле l_whence равным SEEK_SET.

  • Если замок уже кем-то установлен (и вызов F_SETLKW заблокировал бы наш процесс, привел бы к ожиданию), мы получаем информацию о чужом замке в структуру lock. При этом в поле l_pid заносится идентификатор процесса, создавшего этот замок, а в поле l_sysid - идентификатор машины (поскольку блокировка файлов поддерживается через сетевые файловые системы). Замки автоматически снимаются при закрытии дескриптора файла. Замки не наследуются порожденным процессом при вызове fork.
  • #include <stdio.h>

    #include <sys/types.h>

    #include <fcntl.h>

    #include <unistd.h>

    #include <time.h>

    #include <signal.h>

    char DataFile [] = "data.xxx"; char info [] = "abcdefghijklmnopqrstuvwxyz"; #define OFFSET 5 #define SIZE 12




    Содержание  Назад  Вперед