Linux программирование в примерах | страница 92



. Что касается ядра версии 2.4, Linux рассматривает все три флага одинаково со значением флага >O_SYNC. Более того, Linux определяет дополнительные флаги, которые специфичны для Linux и предназначены для специального использования. Дополнительные подробности см. в справочной странице GNU/Linux для open(2).

4.7. Форсирование записи данных на диск

Ранее мы описали флаги >O_DSYNC, >O_RSYNC и >O_SYNC для >open(). Мы отметили, что использование этих флагов может замедлить программу, поскольку >write() не возвращается до тех пор, пока все данные не будут записаны на физический носитель.

Со слегка более высоким уровнем риска мы можем сами испечь свое пирожное и съесть его. Это осуществляется путем открытия файла без указания флагов >O_xSYNC, но с последующим использованием одного из следующих двух системных вызовов в любой момент, когда это необходимо для безопасного перемещения данных на физический носитель:

>#include


>int fsync(int fd); /* POSIX FSC */

>int fdatasync(int fd); /* POSIX SIO */

Системный вызов >fdatasync() подобен >O_DSYNC: он форсирует запись данных на конечное физическое устройство. Системный вызов >fsync() подобен >O_SYNC, форсируя запись на физическое устройство не только данных файла, но и вспомогательных данных. Вызов >fsync() более переносим; он существовал в мире Unix в течение более продолжительного времени, и вероятность его наличия среди широкого ряда систем больше.

Можно использовать эти вызовы с указателями файлов >, вызвав сначала >fflush(), а затем >fileno() для получения дескриптора нижележащего файла. Вот функция >fpsync(), которая может использоваться для заключения обеих операций в один вызов. Она возвращает в случае успеха 0:

>/* fpsync --- синхронизация переменной stdio FILE* */

>int fpsync(FILE *fp) {

> if (fp == NULL || fflush(fp) == EOF || fsync(fileno(fp)) < 0)

>  return -1;

> return 0;

>}

Технически оба этих вызова являются расширениями базового стандарта POSIX: >fsync() в расширении «Синхронизация файлов» (FSC), a >fdatasync() в расширении «Синхронизированный ввод и вывод». Тем не менее, можно без проблем использовать их в системе GNU/Linux

4.8. Установка длины файла

Два системных вызова позволяют настраивать размер файла:

>#include

>#include


>int truncate(const char *path, off_t length); /* XSI */

>int ftruncate(int fd, off_t length); /* POSIX */

Как должно быть очевидно из параметров, >truncate() принимает аргумент имени файла, тогда как