6

mmap() を使用してファイルをメモリにマップしましたが、ファイルの終わりを超えて書き込む必要があります。この場合に何が起こるかについての決定的な文書の証拠を見つけることができません。このドキュメントでは、EOF を超えるアクセスは未定義であると述べています。これを行う正しい方法はありますか?

4

2 に答える 2

4

ファイルのマップを解除し、従来の方法 (fseek から end + fwrite) で拡張し、再度 mmap します。これは非常に高速です。ページインされたファイルの部分は、ページインされたままになります。

マップ中にファイルを拡張してから、mremapすることもできます。マップされたページを変更していないため、これは正常に機能するはずです。これによる影響は、OS に依存する場合があります。

Linux mmap マンページ:

ファイルの追加または削除された領域に対応するページ上のマッピングの基になるファイルのサイズを変更した場合の影響は規定されていません。

于 2012-11-30T22:28:13.280 に答える
3

最初にtruncate(2)または ftruncate(2) を使用して必要な長さを設定し (名前にもかかわらず、ファイルも大きくなります)、次にmmap(2)それを使用します。これは、元の EOF を超えて書き込むときに mmap(2) が何をするかに関係なく、まさにあなたが望むことを行います。

PosixLinux の両方のマニュアル ページには、末尾を超えて書き込むことによってファイルが拡張されないと記載されているため、移植可能なプログラムには、とにかくこれ (または文書化されたファイル拡張子のその他の方法) が必要です。

于 2012-11-30T22:20:58.213 に答える