Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

Шрифт:

% ./lock-file /tmp/test-file

opening /tmp/test-file

locking

Пытаясь поставить блокировку на файл, программа сама окажется заблокированной. Вернитесь в первое окно и нажмите <Enter>:

unlocking

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

fcntl
не переходила в режим ожидания в случае, когда блокировку поставить невозможно, задайте в качестве кода операции константу
F_SETLCK
, а не
F_SETLKW
. Если функция обнаружит, что запрашиваемый файл уже заблокирован, она немедленно вернет -1.

В Linux имеется системный вызов

flock
, также реализующий операцию блокирования файла. Но у функции
fcntl
есть большое преимущество: она работает с файловыми системами NFS [28] (при условии, что сервер NFS имеет относительно недавнюю версию и сконфигурирован правильно). Так что. имея доступ к двум компьютерам, которые монтируют одну и ту же файловую систему через NFS, можно повторить показанный выше пример на двух разных машинах.

28

NFS (Network File System) — популярная технология совместного использования файлов в сети.

8.4. Функции fsync и fdatasync: очистка дисковых буферов

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

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

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

Для реализации такого поведения ОС Linux предоставляет системный вызов

fsync
. Эта функция принимает один аргумент — дескриптор записываемого файла — и принудительно переносит на диск все данные этого файла, находящиеся в кэш-буфере. Функция не завершается до тех пор, пока данные не окажутся на диске.

В листинге 8.3 показана функция, использующая данный системный вызов. Она записывает переданную ей строку в журнальный файл.

Листинг 8.3. (write_journal_entry.c) Запись строки в журнальный файл с последующей синхронизацией

#include <fcntl.h>

#include <string.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

const char* journal_filename = "journal.log";

void write_journal_entry(char* entry) {

 int fd =

open(journal_filename,

O_WRONLY | O_CREAT | O_APPEND, 0660);

 write(fd, entry, strlen(entry));

 write(fd, "\n", 1);

 fsync(fd);

 close(fd);

}

Аналогичное действие выполняет другой системный вызов:

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

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

open
следует указать флаг
O_SYNC
.

8.5. Функции getrlimit и setrlimit: лимиты ресурсов

Функции

getrlimit
и
setrlimit
позволяют процессу определять и задавать лимиты использования системных ресурсов. Аналогичные действия выполняет команда
ulimit
, которая ограничивает доступ запускаемых пользователем программ к ресурсам.

  • Читать дальше
  • 1
  • ...
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: