Книга: Программирование для Linux. Профессиональный подход

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

Листинг 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.

Оглавление книги


Генерация: 6.128. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз