Какая разница между 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);