Книга: Программирование для 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
.
- Инструмент командной строки gbak
- Резервное копирование многофайловых баз данных
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Восстановление из резервных копий многофайловых баз данных
- Forced writes - палка о двух концах
- Инструмент командной строки gfix
- Ответный файл, используемый по умолчанию (csc.rsp)
- Forced Writes
- Создание файлов с блокировкой
- Файлы базы данных InterBase
- Файлы *.GDB изнутри
- Эффективная работа с временными файлами сортировки