質問
と思った 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の実装を必要としないことを示唆しています。
は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()
使用できるよう確保のたデータは保存メディアではできないことがあります。):
- 初回の利用
fflush(fp)
の出力ストリーム(fp
れFILE *
得られたfopen
または大規模データベースの整備の流れstdout
またはstderr
)のバッファの内容に関連するストリームへと重点が移りつつある。 - その利用
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で始まります。