一般的なシステムコールインターフェイスを使用すると、ファイルサイズを小さくできますか(別のinodeに置き換えることなく)?

一般的なシステムコールインターフェイスを使用すると、ファイルサイズを小さくできますか(別のinodeに置き換えることなく)?

open()ファイルを小さくする方法はありますか?もちろん、追加モードで開くことも、最後までナビゲートして成長させることもできます。しかし、私が知っている限り、一般的なUnixスタイルのシステムコールインターフェイスを介してファイルを縮小する方法はありません。

私が知っている限り、これを行う唯一の方法は、より短い新しいファイルを作成し、古いrename()ファイルを置き換えて偽にすることです。

ちょうどその場で新しいファイルを作成し、名前を変更するプロセスを経ずに、ファイルから直接動作するファイルエディタを作成することが可能であるという答えを見て確認したかったです。

私はいつもlibcのファイルAPIと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

これopen(2)システムコールはO_TRUNCファイルサイズを減らすことができるフラグを許可します。

O_TRUNC- ファイルが存在し、通常のファイルであり、ファイルが正常に開かれた場合、またはファイルが開かれると、ファイルのO_RDWRO_WRONLYさがゼロに切り捨てられ、モードと所有者は変更されません。 FIFO特殊ファイルや端末デバイスファイルには影響しません。他のファイルタイプへの影響は実装によって定義されます。 orをO_TRUNC使用しなかった結果は定義されていません。O_RDWRO_WRONLY

プログラムがファイルの内容を完全に上書きすることを目的とする場合によく使用されます。に示すように、シェルのファイルリダイレクト演算子を例に挙げますcommand > file

関連情報