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()
принимает аргумент имени файла, тогда как