質問

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

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

役に立ちましたか?

解決

FILE_FLAG_NO_BUFFERINGオプションを使用してのCreateFile のを見てください

他のヒント

ます。http://www.codeproject。 COM /記事/ 51678 /改善応答性インのWindows-と-FILE_FLする

キャッシュをスワップアウトを防止するための唯一の方法はFILE_FLAG_NO_BUFFERINGフラグでファイルを開くことです。これは、しかし、異なるサイズを要求することができることに依存しているほとんどのアプリケーションの大規模な書き換えを必要とするセクタサイズ(512〜4096バイト)で割り切れるサイズを、持っているために、ディスクI / O要求を必要とします。

このプロジェクトは、ドロップインラッパーキューイング、ファイルが書き込みのためにオープン開閉時にファイルサイズを調整するの世話を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バッファリングを完全かつ直接的に制御することができますが、ファイルや類似のデバイスの場合に考慮される必要があります。

データ整合要件があります

POSIX書き込み()関数のWin32の等価はWriteFile()です。ドキュメントには、I / O、および推奨しています<のhref = "http://msdn.microsoft.com/en-us/library/cc644950%28VS.85%29.aspx" のrel = "nofollowをnoreferrerアンバッファードファイルを使用することをお勧めします「>詳細については、このページます。

ストリームはできる限り低レベルです。そして彼らが できる バッファリングされないこと。

int setvbuf(
   FILE *stream,
   char *buffer,
   int mode,
   size_t size 
);

  setvbuf(stdout, (char *)NULL, _IONBF, 0); //unbuffered stdout

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

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

モードは次のとおりである必要があります _IOFBF , _IOLBF 、 または _IONBF. 。モードが _IOFBF または _IOLBF, の場合、size はバッファのサイズとして使用されます。モードが _IONBF の場合、ストリームはバッファリングされず、サイズとバッファーは無視されます。モードの値とその意味は次のとおりです。

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

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

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

scroll top