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

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

有没有办法open()使文件缩小?当然,我们可以以附加模式打开它们,或者查找到末尾并写入以使它们增长。然而,据我所知,没有办法通过典型的unix风格的系统调用接口来缩小文件。

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

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

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

答案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

open(2)系统调用接受O_TRUNC可以减小文件大小的标志:

O_TRUNC– 如果文件存在并且是普通文件,并且文件成功打开O_RDWRO_WRONLY,则其长度将被截断为0,模式和所有者不变。它对 FIFO 特殊文件或终端设备文件没有影响。它对其他文件类型的影响是实现定义的。O_TRUNC不使用O_RDWRor的结果O_WRONLY是未定义的。

当程序旨在完全覆盖文件内容时,经常使用它。一个例子是 shell 的文件重定向运算符,如 中所示command > file

相关内容