Позволяют ли типичные интерфейсы системных вызовов уменьшить размер файла (без замены его другим инодом)?

Позволяют ли типичные интерфейсы системных вызовов уменьшить размер файла (без замены его другим инодом)?

Есть ли способ получить open()файл и заставить его сжаться? Конечно, можно открыть его в режиме добавления или перейти к концу и записать, чтобы заставить его увеличиться. Однако, насколько мне известно, не существует метода сжать файл через типичные интерфейсы системных вызовов в стиле unix.

Насколько мне известно, единственный способ сделать это — подделать его, создав новый, более короткий файл и rename()заменив им старый.

Я просто хотел подтверждения, потому что видел ответ, подразумевающий, что можно создать редакторы файлов, которые будут работать непосредственно с файлом, а не проходить процесс создания нового файла и переименования его на месте.

Я всегда думал, что файловый API в libc и интерфейсы системных вызовов в стиле Unix не позволяют сжимать файлы, чтобы упростить реализацию файловых систем и, возможно, избежать шаблонов использования, которые могут способствовать фрагментации.

решение1

man -s 2 ftruncateговорит

DESCRIPTION
   The  truncate()  and  ftruncate()  functions cause the regular file
   named by path or referenced by fd to be truncated to a size of precisely
   length bytes.

...

CONFORMING TO
   POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (these calls first appeared in 4.2BSD).

Далее говорится, что если вы используете ftruncate, вы должны открыть файл для записи, а если вы используете truncate, файл должен быть доступен для записи.

решение2

Theopen(2)системный вызов принимает O_TRUNCфлаг, который может уменьшить размер файла:

O_TRUNC– Если файл существует и является обычным файлом, и файл успешно открыт O_RDWRили O_WRONLY, его длина будет усечена до 0, а режим и владелец останутся неизменными. Он не будет иметь никакого эффекта на специальные файлы FIFO или файлы терминальных устройств. Его эффект на другие типы файлов определяется реализацией. Результат использования O_TRUNCбез O_RDWRили O_WRONLYне определен.

Он часто используется, когда программа стремится полностью перезаписать содержимое файла. Примером может служить оператор перенаправления файлов вашей оболочки, как в command > file.

Связанный контент