一般的なシステム コール インターフェイスでは、ファイルのサイズを縮小できますか (別の 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_RDWR、または の場合O_WRONLY、その長さは 0 に切り捨てられ、モードと所有者は変更されません。 FIFO 特殊ファイルまたは端末デバイス ファイルには影響しません。他のファイル タイプへの影響は実装定義です。 または のいずれO_TRUNCも使用せずにを使用した場合の結果は未定義です。O_RDWRO_WRONLY

これは、プログラムがファイルの内容全体を上書きしようとする場合によく使用されます。例としては、 のようなシェルのファイル リダイレクト演算子がありますcommand > file

関連情報