4

私は単純なロガーを作成しました。これは、重要なことをすべてテキスト ファイルに記録するものです。を使用していますが、問題があります。プログラムが何らかの理由 (クラッシュなど) でstd::ofstreamファイルを閉じない (呼び出し) 場合、作成されたログは実際には空 (0 サイズ) になります。std::ofstream::close()また、ログは例外的な状況 (何かがうまくいかない場合) で最も役立つため、問題がわかります。

それからログを保護する方法はありますか? 数行ごとに書き込み、追加を使用した後にファイルを閉じてみることもできますが、ログの途中/ファイルを閉じる前にプログラムがクラッシュする状況からはまだ保護されません。解決策はありますか、それとも私は運命にあるのでしょうか?

4

2 に答える 2

4

フラッシュメソッドを使用する必要があります。直面している問題を正確に解決するためのものです。

より安全と見なすことができる別のアプローチがありますが、実装とテストにはかなりの労力が必要です。このアプローチは、プロセス間通信 (IPC)として知られているものに要約されます。簡単に言うと、ロガーを、特定のプロトコル(インターフェース)を介してターゲット アプリケーションと通信する別のロガー アプリケーションとして実装できます。このようなプロトコルを自分で開発するか、既存のもの (通常は非常に汎用的、つまり汎用的) の 1 つを使用できます。その結果、ターゲット アプリケーションがクラッシュした場合、ロガー アプリケーションがドラッグされないため、ロガーは安全にジョブを終了できます。

このアプローチは、通常、大規模で複雑で安全性が重要なシステムで使用されます。flush()ただし、あなたの場合、これは間違いなくやり過ぎであり、追加するたびに十分すぎると思います。

于 2013-04-28T21:40:08.593 に答える
2

私たちの商用アプリケーションでは、そのための非常に堅牢なソリューションがありました。価格は携帯性がありませんでした。

Vectored Exception Handler をインストールしました。このハンドラーは、未処理の OS 例外が発生した場合、プログラムが終了する前に呼び出されます (最も一般的なクラッシュです)。呼び出されると、C++ 標準ライブラリ関数 (または C 関数でさえも) を呼び出すことができなくなります。さえfflush信頼できません。

それでも、基本的な OS 関数を呼び出すことは問題ありません。ただし、注意してください。OS 呼び出しの引数の設定では、mallocどちらも使用しないでください。クラッシュが実際に発生する前に、クラッシュファイルの名前を設定しておきます。再度 OS 機能を使用して、すぐにファイルを閉じてください。

于 2013-04-28T23:56:50.850 に答える