質問

と思った fsync()fflush() 社内で使用 fsync() にストリームにあります。がんの予期せぬ結果で実行した場合の下でのネットワークI/O

私のコードスニペット:

FILE* fp = fopen(file, "wb");
/* multiple fputs() calls like: */
fputs(buf, fp);
...
...
fputs(buf.c_str(), fp);
/* get fd of the FILE pointer */
fd = fileno(fp);
#ifndef WIN32
ret = fsync(fd);
#else
ret = _commit(fd);
fclose(fp);

うですが _commit() ないフラッシングのデータ(またはWindowsのデータとして生まれて初めてのLinux輸出ファイルシステム).

私のコードです:

FILE* fp = fopen(file, "wb");
/* multiple fputs() calls like: */
fputs(buf, fp);   
...   
...
fputs(buf.c_str(), fp);
/* fflush the data */
fflush(fp);
fclose(fp);

でフラッシュのデータです。

私の場合 _commit() も同じことが行われていて fflush().他の入力?

役に立ちましたか?

解決

fflush()FILE*上で動作、それだけでOSのうち、アプリケーションのFILE*で内部バッファをフラッシュします。

fsyncは低いレベルで動作し、それは物理的なメディアにそのバッファをフラッシュするためにOSを伝えます。

OSは大きく、あなたがファイルに書き込むデータをキャッシュします。 OSがドライブを打つためにあらゆる書き込みを強制した場合、物事はの非常にの遅いだろう。データはドライブを打つ必要がある場合(特に)fsyncは、あなたがコントロールすることができます。

さらに、fsyncを/ファイルディスクリプタの作品をコミット。それはFILE*の知識を持たないし、そのバッファをフラッシュすることはできません。 FILE*は、ファイルディスクリプタは、通常、OSのカーネルに住んで、あなたのアプリケーションに住んでいます。

他のヒント

標準C関数fflush()とPOSIXシステムコールfsync()は、概念的に幾分類似しています。 fflush()は、Cファイルストリーム(FILEオブジェクト)上で動作し、したがって、ポータブルです。 fsync()は、POSIXのファイル記述子を操作します。 どちらの原因は、宛先に送信するデータをバッファリングします。

POSIXシステムでは、各Cファイルストリームは、関連するファイル記述子 Cファイルストリーム上の、およびすべての操作は、ファイル記述子で動作するPOSIXシステムコールに、委任することにより実現される。

一つは、POSIXシステム上のfflushへの呼び出しは、そのファイルストリームのファイルディスクリプタについてwriteの呼び出しに続いて、ファイルストリームのバッファ内のすべてのデータのfsync()を引き起こすだろうと思うかもしれません。だから、POSIXシステム上fflushへの呼び出しでfsync(fileno(fp))への呼び出しを追跡する必要はありません。しかし、ケースがあることである:?fsyncからfflushへの呼び出しがある

いいえ、POSIXシステム上fflushを呼び出すと、そのfsyncが呼び出されます意味するものではありません。

fflushのC標準は、

(強調追加)と言います
  ファイル

が書き込まれるのホスト環境に配信される[]ストリームのための任意の書き込まれていないデータが発生します

書かれた であるというよりも、すること書き込まれたデータであることを言っては、ホスト環境によってさらにバッファリングを許可することを意味します。 「ホスト環境」によってそのバッファリングは、POSIX環境のために、fsyncのフラッシュその内部バッファリングを含めることができます。標準コールfsyncにPOSIXの実装を必要としないことを示唆しています。

Cの標準の近い読書だから

fflush POSIX標準説明は次のように、宣言しないのCセマンティクスするの拡張、そのfsyncが呼び出されます。

私は簡単にするためにそれを言うことができます:

(ファイルディスクリプタの整数)のファイルをストリーミングではないとの

使用fsync()

ファイルストリームで使用するfflush()ます。

また、ここでは男性からの助けでます:

int fflush(FILE *stream); // flush a stream, FILE* type

int fsync(int fd); // synchronize a file's in-core state with storage device
                    // int type

fflush()fsync() 使用できるよう確保のたデータは保存メディアではできないことがあります。):

  1. 初回の利用 fflush(fp) の出力ストリーム(fpFILE * 得られた fopen または大規模データベースの整備の流れ stdout または stderr)のバッファの内容に関連するストリームへと重点が移りつつある。
  2. その利用 fsync(fileno(fp)) のOSその結果、自身のバッファに保存す。

ただし、 fileno()fsync() はPOSIX機能はご利用頂けない場合がござすべてのシステム、特にMicrosoftレガシーシステムが数名 _fileno(), _fsync() または _commit()...

同期()またはFSYNC()関数を使用し、ディスクへの最近の変更のコミットメントを強制します。

のにfsync()の永久記憶デバイスで指定したファイルのデータおよびメタデータのすべてを同期します。対応するファイルがクローズされた直前に呼び出されなければなりません。

の同期()のディスクへのすべての変更されたファイルをコミットします。

私のpythonからドキュメントを下回ると思います( https://docs.python.org/ 2 /ライブラリ/ os.html に)非常によく明確化してます。

   os.fsync(FD)のファイル記述子を持つファイルの強制書き込みは、ディスクへのfdが。オン   Unixのは、これは、ネイティブのfsync()関数を呼び出します。 Windows上で、MS   _commit()関数

     

あなたはPythonのファイルオブジェクトfを開始している場合は、最初の)(f.flushを行い、   その後、そのすべての内部バッファを確保するために、(f.filenoを())os.fsync行います   Fに関連付けられているディスクに書き込まれます。

     

利用できる環境:Unix、およびWindows

2.2.3で始まります。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top