Есть ли способ для open()
файла и вызвать его сжатие? Можно, конечно, открыть их в режиме добавления или искать до конца и написать, чтобы они росли. Однако, насколько я знаю, нет способа сжать файл через типичные интерфейсы системных вызовов в стиле Unix.
Насколько я знаю, единственный способ сделать это - подделать его, создав новый более короткий файл, а rename()
не старый.
Я просто хотел получить подтверждение, потому что увидел ответ, который подразумевал, что можно создать файловые редакторы, работающие непосредственно с файлом, вместо того, чтобы проходить процесс создания нового и переименовывать его на месте.
Я всегда думал, что файловый интерфейс API в интерфейсах системных вызовов в стиле libc и unix не позволяет уменьшить файлы, чтобы упростить реализацию файловых систем и, возможно, избежать использования моделей, которые могут способствовать фрагментации.
источник
fopen
в режиме «w» (или «w +») автоматически обрезает его до нулевой длины. Или вы имеете в виду сокращение до ненулевого размера, чтобы сохранить часть старого содержимого?open()
иopenat()
уже есть флаг для усечения,O_TRUNC
так что технически это приводит к уменьшению файла - то есть к полному сокращению - без изменения inode. Самый известный пример тогоcommand > file.txt
, где файл будет обрезан, если он существует. Если вы бежитеstrace
наbash -c 'true > /dev/null'
вас будут видетьopenat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
на выходе. Конечно, для переменного размера усечения вам нуженtruncate()
системный вызов. Дайте мне знать, если вы хотите это как реальный ответ вместо комментария.Ответы:
man -s 2 ftruncate
говорит...
далее говорится, что если вы используете ftruncate, вы, должно быть, открыли файл для записи, а если вы используете truncate, файл должен быть доступен для записи.
источник
truncate
учитывает новый размер файла, а затем -write
его. Какtruncate
и системный вызов, который вы ищете.fallocate(FALLOC_FL_COLLAPSE_RANGE)
open(2)
Системный вызов принимаетO_TRUNC
флаг , который может уменьшить размер файла:Он часто используется, когда программа стремится полностью перезаписать содержимое файла. Примером является оператор перенаправления файлов вашей оболочки, как в
command > file
.источник