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



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


Блокировка доступа к файлам.

В базах данных нередко встречается ситуация одновременного доступа к одним и тем же данным. Допустим, что в некотором файле хранятся данные, которые могут читаться и записываться произвольным числом процессов.

  • Допустим, что процесс A изменяет некоторую область файла, в то время как процесс B пытается прочесть ту же область. Итогом такого соревнования может быть то, что процесс B прочтет неверные данные.
  • Допустим, что процесс A изменяет некоторую область файла, в то время как процесс C также изменяет ту же самую область. В итоге эта область может содержать неверные данные (часть - от процесса A, часть - от C).
  • Ясно, что требуется механизм синхронизации процессов, позволяющий не пускать другой процесс (процессы) читать и/или записывать данные в указанной области. Механизмов синхронизации в UNIX существует множество: от семафоров до блокировок областей файла. О последних мы и будем тут говорить.

    Прежде всего отметим, что блокировки файла носят в UNIX необязательный характер. То есть, программа не использующая вызовов синхронизации, будет иметь доступ к данным без каких либо ограничений. Увы. Таким образом, программы, собирающиеся корректно пользоваться общими данными, должны все использовать - и при том один и тот же механизм синхронизации: заключить между собой "джентльменское соглашение".

    6.9.1. Блокировка устанавливается при помощи вызова

    flock_t lock;

    fcntl(fd, operation, &lock);

    Здесь operation может быть одним из трех:

    F_SETLK

    Устанавливает или снимает замок, описываемый структурой lock. Структура flock_t

    имеет такие поля:

    short l_type; short l_whence; off_t l_start; size_t l_len;

    long l_sysid; pid_t l_pid;

    l_type

    тип блокировки:

    F_RDLCK - на чтение; F_WRLCK - на запись; F_UNLCK - снять все замки.

    l_whence, l_start, l_len

    описывают сегмент файла, на который ставится замок: от точки lseek(fd,l_start,l_whence); длиной l_len байт. Здесь l_whence может быть: SEEK_SET, SEEK_CUR, SEEK_END. l_len равное нулю означает "до конца файла". Так если все три параметра равны 0, то будет заблокирован весь файл.




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