Какая разница между fallocate и ftruncate

Все они могут изменить размер файла в соответствии с моим тестом. Почему они все могут изменить файл на больший и короткий? какая разница между fallocate и ftruncate?

3 ответа

ftruncate это простая, одноцелевая функция. Согласно документации POSIX, он просто устанавливает файл на требуемую длину:

Если fildes ссылается на обычный файл, ftruncate() функция должна привести к сокращению размера файла до length,...

ftruncate() также является стандартной функцией POSIX и является переносимым. Обратите внимание, что POSIX не определяет, как ОС устанавливает длину файла, например, является ли файл с любой длиной разреженным файлом.

fallocate() это специфичная для Linux функция, которая делает намного больше и очень специфическими способами:

Выделение дискового пространства

Операция по умолчанию (т. Е. Режим равен нулю) для функции fallocate() выделяет дисковое пространство в диапазоне, указанном offset а также len, Размер файла (как сообщается stat(2)) будет изменено, если offset+len больше, чем размер файла. Любой субрегион в пределах диапазона, указанного в offset и len, который не содержал данных до вызова, будет инициализирован нулем. Это поведение по умолчанию очень похоже на поведение posix_fallocate(3) библиотечная функция, и предназначена как метод оптимальной реализации этой функции.

...

Распределение файлового пространства

Указание FALLOC_FL_PUNCH_HOLE флаг (доступен с Linux 2.6.38) в режиме освобождает пространство (т.е. создает дыру) в диапазоне байтов, начиная с offset и продолжая для len байт. В пределах указанного диапазона частичные блоки файловой системы обнуляются, а целые блоки файловой системы удаляются из файла. После успешного вызова последующие чтения из этого диапазона вернут нули.

...

Свертывание файлового пространства

Указание FALLOC_FL_COLLAPSE_RANGE Флаг (доступен с Linux 3.15) в режиме удаляет диапазон байтов из файла, не оставляя дыры. Диапазон байтов, который нужно свернуть, начинается с offset и продолжается len байт. По завершении операции содержимое файла начинается с места offset+len будет добавлено по смещению местоположения, и файл будет len байты меньше.

...

Обнуление файлового пространства

Указание FALLOC_FL_ZERO_RANGE флаг (доступен с Linux 3.15) в режиме обнуляет пространство в диапазоне байтов, начиная с offset и продолжая для len байт. В пределах указанного диапазона блоки предварительно выделяются для областей, которые охватывают отверстия в файле. После успешного вызова последующие чтения из этого диапазона вернут нули.

...

Увеличение файлового пространства

Указание FALLOC_FL_INSERT_RANGE Флаг (доступен с Linux 4.1) в режиме увеличивает файловое пространство, вставляя дыру в размер файла, не перезаписывая существующие данные. Отверстие начнется в offset и продолжить для len байт. При вставке отверстия внутри файла содержимое файла начинается с offset будет смещено вверх (т.е. к большему смещению файла) на len байт. Вставка отверстия внутри файла увеличивает размер файла на len байт.

...

С помощью ftruncate вы указываете Linux желаемый размер этого файла. Он будет вырезать лишнее пространство, если файл становится короче (включая освобождение дискового пространства), или добавлять нули, выделяя дисковое пространство, если вы делаете файл длиннее.

fallocate- это функция общего назначения для изменения диапазона байтов, принадлежащих файлу.

В зависимости от того, как вы используете fallocate, вы можете выполнить все, что могли, с ftruncate с fallocate. Это немного сложнее, так как вам нужно будет знать, какой диапазон вам нужно выделить / освободить (начальное смещение + длина).

С помощью fallocate вы можете предварительно выделить дисковое пространство без логического увеличения файла (например, файл с нулевым байтом на уровне ls, который использует 1 ГБ).

Я только что написал программу на C для выполнения высокопроизводительного сжатия файла с помощью прямого ввода-вывода с использованием fallocate и ftruncate. Я использую fallocate для предварительного выделения 64 МБ файла за раз. В конце концов, я использую ftruncate, чтобы обрезать выделенное лишнее пространство.

Отлично работает с XFS, я подтвердил, что ftruncate действительно освобождает дисковое пространство с помощью xfs_bmap -vp для нескольких файлов.

Как я теперь знаю:
1.fallocate не может изменить файл на более короткий. это добавляет фактическое пространство к файлу.
2.ftruncate добавить len, чтобы "описать", как объявление.

Fallocate используется для предварительного выделения блоков в файл

Следующая команда выделит файл размером 1 ГБ.

fallocate -l 1G test_file1.img

ftruncate - установить файл на указанную длину

ftruncate(fileno(fout),size);
Другие вопросы по тегам