典型的系统调用接口是否允许减小文件的大小(而不用不同的 inode 替换它)?

JoL*_*JoL 9 filesystems files

有没有办法让open()文件缩小?当然,可以在追加模式下打开它们或寻找到最后并写入以导致它们增长。但是,据我所知,没有办法通过典型的 Unix 风格的系统调用接口来缩小文件。

据我所知,唯一的方法是通过创建一个新的较短的文件并rename()代替旧文件来伪造它。

我只是想确认一下,因为我看到一个答案暗示可以制作直接处理文件的文件编辑器,而不是经历制作新文件并在适当位置重命名的过程。

我一直认为 libc 和 unix 风格的系统调用接口中的文件 api 不允许缩小文件以简化文件系统的实现,并可能避免可能导致碎片化的使用模式。

ica*_*rus 22

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.
Run Code Online (Sandbox Code Playgroud)

...

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

它继续说,如果您使用 ftruncate,您必须打开文件进行写入,如果您使用 truncate,则该文件必须是可写的。