私が知っている限り、オペレーティングファイルの場合、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
バイト範囲。操作が完了すると、その場所から始まるファイルの内容がその場所に追加され、ファイル内のバイト数が減ります。offset
len
offset+len
offset
len
[...]
ファイルスペースを増やす
既存のデータを上書きせずにファイルサイズに穴を挿入してファイルスペースを増やすには、
FALLOC_FL_INSERT_RANGE
フラグ(Linux 4.1以降で利用可能)を指定します。mode
穴はそこから始まり、バイトを続けoffset
ますlen
。ファイル内に穴が挿入されると、から始まるファイルの内容がoffset
上に(つまり、より高いファイルオフセットに)バイト移動しますlen
。ファイルに穴を挿入すると、ファイルサイズがlen
バイト単位で増えます。
答え2
現在のすべてのファイルシステムでは、隣接するメモリブロックにファイルを保存する必要がないため、
ファイルシステムは、隣接する領域にファイルを保存する必要はないかもしれませんが(実際には非常に柔軟ではありません)、ファイルは固定サイズのブロック(または一連の連続ブロック)に保存されることがよくあります。これは実装を簡素化し、ブロックは通常、デフォルトのデバイスブロックサイズの倍数です。
したがって、任意の長さのブロック挿入を実装すると、ファイルシステムの形式と実装がより複雑になる可能性があるか、潜在的に大量のデータを移動する必要があります。これらのどれも良いことではなく、ファイルシステムAPIの上にユーザースペースに複雑なデータ構造を構築できます。