write() 関数を使用して大量のメモリ (2GB 以上) をファイルに書き込もうとしましたが、成功しませんでした。誰か優しくして、私に何をすべきか教えてくれませんか?
3 に答える
Linuxを想定しています:)
https://users.suse.com/~aj/linux_lfs.html
_FILE_OFFSET_BITS
64 に定義します。 (gcc -D_FILE_OFFSET_BITS=64
)- とを定義
_LARGEFILE_SOURCE
し_LARGEFILE_SOURCE64
ます。 O_LARGEFILE
大きなファイルを操作するには、open でフラグを使用します
そこにもいくつかの情報があります: http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
最近では、システムにあるファイル システムはすぐに大きなファイルをサポートします。
-D_FILE_OFFSET_BITS=64
コンパイラ コマンド ライン (aka )に追加すると、機能しますCFLAGS
。これは、64 ビット システムでは必要ありません。また、最近では一部の (すべてではない) 32 ビット システムでも不要です。
ソース全体に書き込みなどO_LARGEFILE
を行うようにというアドバイスは避けてください。open64
これは移植性がなく、単純に醜いです。
編集:実際、私たちは皆、あなたの問題を誤解していると思います. 32 ビット システムを使用している場合、メモリ内で可能な最大の単一オブジェクトは 2GB-1 バイト (つまりSSIZE_MAX
) です。POSIX では、write
収まらないサイズ引数の動作ssize_t
は定義されていません。これは、write
型が返さssize_t
れ、書き込まれたバイト数が大きい場合は、その数を表すことができないためです。おそらくもっと重要なことは、オブジェクトのサイズが に収まらないほど大きいオブジェクトを実装で許可することは危険です。これはptrdiff_t
、ポインター演算が整数オーバーフローを引き起こし、未定義の動作を引き起こす可能性があるためです。このような大きなオブジェクトを作成できたかもしれませんmmap
(私はこれをシステムのカーネルまたは libc のバグと考えます)、しかしそれは非常に悪い考えであり、あらゆる種類のバグにつながります。2GB を超える単一オブジェクトが必要な場合は、安全でバグのない 64 ビット マシンで実行する必要があります。
オペレーティング システム、プロセッサ、ファイル システムによって異なります。Linux/x86-64 システム (ext3 ファイル システムを使用) では、簡単に実行できます。通常のライブラリ関数 ( C++ std::ofstream
、 C <stdio.h>
、fopen
&&fprintf
など) または基礎となるシステム コール (open、write) を使用するだけです。