2

高速通信リンクを監視し、ログをファイルに書き込む(標準のCファイルIOを介して)アプリケーションがあります。fflushリンクに到着するメッセージへの応答時間は重要です。そのため、応答時間が遅くなるため、各メッセージでファイルを作成しないことを承知しています。

ただし、状況によっては(プロセスを強制終了するなどして)アプリケーションが「激しく」終了し、この場合、最後の数個のログメッセージが書き込まれません(通信リンクがしばらくの間静かであったとしても)。

ほとんどのデータが確実にフラッシュされるようにするために、どのような手法/戦略を使用できますが、応答の速度をあきらめることはありませんか?

編集:アプリケーションはWindowsで実行されます

4

4 に答える 4

4

これに対する標準的な解決策は、スレッドを使用することです。データ収集コードでデータをスレッド セーフ キューに書き込み、セマフォを使用して書き込みスレッドに信号を送ります。

ただし、そこに行く前に、fflush() が遅くなるという主張を再確認してください。ほとんどのオペレーティング システムには、ファイル システム キャッシュがあります。単純なメモリからメモリへのブロック コピーとして、書き込みが非常に高速になります。データは遅延してディスクに書き込まれ、クラッシュは影響しません。

于 2009-01-22T12:47:52.360 に答える
3

Unix または Linux を使用している場合、プロセスは何らかの終了シグナルを受け取りますが、これはシグナル ハンドラーでキャッチできます ( を除くSIGKILL) 。fflush()

信号キャッチについては、 を参照してくださいman sigaction

編集:Windowsについてはわかりません。

于 2009-01-22T12:49:53.370 に答える
2

非同期書き込みをお勧めします。そうすれば、書き込み IOP が発生するのを待つ必要がなく、OS が IOP を遅らせることもありません。CreateFile() フラグ を参照してくださいFILE_FLAG_WRITE_THROUGH | FILE_FLAG_OVERLAPPED

必要ありませんFILE_FLAG_NO_BUFFERING。それは、OS キャッシュをスキップするだけです。OS全体が激しく死ぬことを心配している場合にのみ必要です。

于 2009-01-23T13:27:34.807 に答える