典型的系統呼叫介面是否允許減小檔案的大小(而不用不同的索引節點替換它)?

典型的系統呼叫介面是否允許減小檔案的大小(而不用不同的索引節點替換它)?

有沒有辦法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

相關內容