Книга: Разработка приложений в среде Linux. Второе издание
13.3.1. Блокировочные файлы
13.3.1. Блокировочные файлы
Блокировочные файлы являются наиболее простым методом блокирования. Каждый нуждающийся в блокировании файл данных ассоциируется с блокировочным файлом. Когда блокировочный файл существует, файл данных считается заблокированным, и другие процессы не имеют к нему доступа. Когда блокировочный файл не существует, процесс создает его и затем получает доступ к файлу данных. До тех пор, пока процедура создания блокировочного файла атомарна (только один процесс за раз может "владеть" блокировочным файлом), этот метод гарантирует доступ к файлу со стороны только одного процесса в каждый момент времени.
Идея довольно проста. Когда процесс намеревается получить доступ к файлу, он блокирует файл следующим образом.
fd = open("somefile.lck", O_RDONLY, 0644);
if (fd >= 0) {
close(fd);
printf("файл уже заблокирован");
return 1;
} else {
/* блокировочный файл не существует, мы можем заблокировать его
и получить доступ */
fd = open("somefile.lck", O_CREAT | O_WRONLY, 0644");
if (fd < 0) {
perror("ошибка при создании блокировочного файла");
return 1;
}
/* можем записать pid в файл */
close(fd);
}
Когда процесс заканчивает обработку файла, он вызывает unlink("somefile.lck")
для снятия блокировки.
Несмотря на то что показанный выше фрагмент кода выглядит корректным, он позволяет при некоторых обстоятельствах нескольким процессам блокировать один файл, а именно этого и следует избегать в блокировании. Если процесс проверяет существование блокировочного файла, убеждается в том, что блокировочный файл не существует, и прерывается ядром, чтобы позволить выполняться прочим процессам, то какой-то другой процесс сможет заблокировать файл до того, как исходный процесс создаст блокировочный файл. Флаг O_EXCL
для open()
может сделать создание блокировочного файла атомарным и, следовательно, защищенным от условия состязаний. После установки O_EXCL
вызов open()
завершается неудачей, если файл уже существует. Это упрощает создание блокировочных файлов, которое происходит так, как показано ниже.
fd = open("somefile.lck", O_WRONLY | O_CREAT | O_EXCL, 0644);
if (fd < 0 && errno == EEXIST) {
printf("файл уже заблокирован");
return 1;
} else if (fd < 0) {
perror("непредвиденная ошибка при проверке блокировки");
return 1;
}
/* можем записать pid в файл */
close(fd);
Блокировочные файлы используются для блокирования широкого ряда стандартных файлов Linux, включая последовательные порты и файл /etc/passwd
. Хотя они хорошо работают со многими приложениями, им присущи и несколько серьезных недостатков.
• Только один процесс за один раз может иметь блокировку, предотвращая одновременное чтение файла несколькими процессами. Если файл обновляется атомарно[88], то процессы, читающие файл, могут проигнорировать вопросы блокирования, но атомарные обновления сложно поддерживать для сложных файловых структур.
• Флаг O_EXCL
надежен только в локальных файловых системах. Ни одна из сетевых файловых систем, поддерживаемых Linux, не сохраняет семантику O_EXCL
между несколькими машинами, блокирующими общий файл[89].
• Блокирование является только рекомендательным; процессы могут обновить файл, несмотря на существование блокировки.
• Если процесс, удерживающий блокировку, аварийно завершается, блокировочный файл остается. Если идентификатор блокирующего процесса сохранен в блокировочном файле, другие процессы могут проверить существование блокирующего процесса и снять блокировку, если тот завершился. Это, однако, сложная процедура, которая не поможет, если идентификатор процесса повторно используется другим процессом при проверке.
- Файлы базы данных InterBase
- Файлы *.GDB изнутри
- 12.2. Файлы конфигураци исервера
- Как вернуть случайно удаленные файлы?
- Как записать файлы на компакт-диск?
- Как сделать, чтобы в папке сначала отображались самые новые файлы?
- Перемещать файлы удобнее, если запустить два экземпляра Проводника и разместить их окна бок о бок. Можно ли это делать а...
- Файлы без расширения, как правило, текстовые. Как сделать, чтобы при двойном щелчке кнопкой мыши они открывались в Блокн...
- На установочном диске Windows много файлов с расширением CAB. Что это за файлы?
- Как сохранить все файлы при переустановке?
- При попытке войти в систему Пользователю1 выдается предупреждение, что загрузился временный профиль и все сделанные изме...
- Не могу открыть файлы ISO. Что и где мне надо скачать?