ファイル挿入システムコールがないのはなぜですか?

ファイル挿入システムコールがないのはなぜですか?

私が知っている限り、オペレーティングファイルの場合、Linuxにはファイルの内容を上書きする(または最後の場合は拡張する)sys_writeシステムコールしかありません。

ファイルにコンテンツを挿入または削除するためのシステムコールがLinuxにないのはなぜですか?

現在のすべてのファイルシステムでは、隣接するメモリブロックにファイルを保存する必要がないため、効率的な実装が可能です。 (ファイルが断片化されます。)

現在のコンテンツを挿入する方法は、「書き込み時のコピー」や「透明ファイルの圧縮」などのファイルシステム機能のため、非常に非効率的なようです。

ベストアンサー1

これは実際に最近のLinuxシステムでは可能ですが、詰まった(ほとんど4096)、いいえバイト粒度、特定のファイルシステム(ext4およびxfs)でのみ可能です。

から引用fallocate(2)マンページ:

int fallocate(int fd, int mode, off_t offset, off_t len);

[...]

ファイルスペースの競合

穴を残さずにファイルからバイト範囲を削除するFALLOC_FL_COLLAPSE_RANGEには、フラグ(Linux 3.15以降で使用可能)を指定します。開始してバイト単位で折りたたみ続ける modeバイト範囲。操作が完了すると、その場所から始まるファイルの内容がその場所に追加され、ファイル内のバイト数が減ります。offsetlenoffset+lenoffsetlen

[...]

ファイルスペースを増やす

既存のデータを上書きせずにファイルサイズに穴を挿入してファイルスペースを増やすには、FALLOC_FL_INSERT_RANGEフラグ(Linux 4.1以降で利用可能)を指定します。mode穴はそこから始まり、バイトを続けoffsetますlen。ファイル内に穴が挿入されると、から始まるファイルの内容がoffset上に(つまり、より高いファイルオフセットに)バイト移動しますlen。ファイルに穴を挿入すると、ファイルサイズがlenバイト単位で増えます。

おすすめ記事