10

Linux システムの「書き込み」に相当する、バッファーを持たない低レベルの C/C++ API を見つけたいと考えています。ありますか?

fread、fwrite などのバッファリングされた I/O は、私が望んでいたものではありません。

4

5 に答える 5

5

http://www.codeproject.com/Articles/51678/Improve-responsiveness-in-Windows-with-the-FILE_FL

FILE_FLAG_NO_BUFFERINGキャッシュのスワップアウトを防ぐ唯一の方法は、フラグを付けてファイルを開くことです。ただし、これにはディスク I/O 要求がセクター サイズ (512 から 4096 バイト) で割り切れるサイズである必要があり、さまざまなサイズを要求できることに依存するほとんどのアプリケーションを大幅に書き直す必要があります。

このプロジェクトには、書き込み用に開かれたファイルを閉じるときにファイル サイズのキューイングと調整を行う、、、、および関数をCreateFile_NB()提供するReadFile_NB()ドロップイン ラッパーが含まれています。WriteFile_NB()CloseHandle_NB()

http://msdn.microsoft.com/en-us/library/cc644950(v=vs.85).aspx

CreateFile 関数を使用してファイルを開いたり作成したりするときに、FILE_FLAG_NO_BUFFERINGフラグを指定して、ファイルから読み書きされるデータのシステム キャッシュを無効にすることができます。これにより、データ I/O バッファリングを完全かつ直接制御できますが、ファイルや同様のデバイスの場合は、考慮しなければならないデータ アライメント要件があります。

于 2012-11-09T20:38:20.683 に答える
2

ストリームは可能な限り低レベルであり、バッファリングを解除できます。

int setvbuf(
   FILE *ストリーム、
   char *バッファ、
   int モード、
   size_t サイズ
);

  setvbuf(stdout, (char *)NULL, _IONBF, 0); //バッファリングされていない標準出力

これは、vc2008 ヘルプ ドキュメントからの抜粋です。

setvbuf 関数を使用すると、プログラムはストリームのバッファリングとバッファ サイズの両方を制御できます。stream は、開いてから I/O 操作を受けていない開いているファイルを参照する必要があります。buffer が指す配列は、それが NULL でない限り、バッファーとして使用されます。NULL の場合、setvbuf は、長さ size/2 * 2 バイトの自動的に割り当てられたバッファーを使用します。

モードは_IOFBF_IOLBF、または_IONBFでなければなりません。mode が_IOFBFまたは_IOLBFの場合、 size がバッファーのサイズとして使用されます。モードが _IONBF の場合、ストリームはバッファリングされず、サイズとバッファは無視されます。モードの値とその意味は次のとおりです。

_IOFBF フルバッファリング。つまり、buffer はバッファーとして使用され、size はバッファーのサイズとして使用されます。バッファが NULL の場合、自動的に割り当てられたバッファ サイズのバイト長が使用されます。

_IOLBF 一部のシステムでは、これにより行バッファリングが提供されます。ただし、Win32 の場合、動作は _IOFBF - フル バッファリングと同じです。

_IONBF バッファまたはサイズに関係なく、バッファは使用されません。

于 2009-03-31T14:19:18.607 に答える
2

_write MSDN Page Hereを使用できます。

于 2009-03-31T14:40:55.417 に答える