2011-01-29 13 views
1

私は多くのログファイルが必要です。プログラムの開始時に作成され、プログラムが終了するとファイルに保存されます。それを行うために優れている場合、私は思っていたfopen:開いたままにするか、バッファを使用するのは良い考えですか?

のfopen()プログラムの開始時にプログラムが終了したときに、その後、ファイルを閉じます - 必要なときに私はちょうどファイルに書き込みます。これらのファイルがまだ「開かれている」状態で何か(他のファイルioなど)が減速しますか?

OR

プログラムが終了したとき、私は、バッファから、書き込み、クローズファイルをバッファに書き込まれる必要があるものを保存し、開いているファイル。私はこれがより速くなると思いますか?

答えて

8

まあ、fopen(3) + fwrite(3) + fclose(3)です。バッファされたI/Oパッケージなので、別のバッファリングレイヤーでは処理が遅くなることがあります。

いずれにしても、簡単で正しいプログラムに進んでください。それがゆっくりと実行されるように見える場合は、それをプロファイルし、推測ではなく推測に基づいて最適化します。

+0

+1また、プログラムの実行中にバッファに書き込んでも、クラッシュが発生したときに書き込まれるとは限りません。できるだけ多くのディスクをディスク上に置くことをお勧めします。 –

3

短い答え:開いているファイルの

  1. ビッグ番号は、ファイルへの書き込みは何も
  2. だから、あなたが開いたが、やるそれらのファイルを残すことができますとにかく

バッファリングされます遅くてはなりませんあなたのOSで開いているファイルの制限をチェックすることを忘れないでください。

+0

バッファされたI/OとバッファされていないI/Oについて論じるとき、この用語はほとんどの場合、ユーザープログラムがカーネルに何を伝えているのかを指します。ほとんどの場合、* "カーネルによってバッファリングされる"と言うのは間違いです* * "Cランタイムライブラリによって"、* "はい"の意味であれば、私は同意します。 – DigitalRoss

+0

OSにもよるかもしれないと思います – Elalfer

+0

ああ、ありがとう。私はC++のioがバッファされていることを知っていましたが、Cではわかりませんでした。どのような場所で私は基本的なIOと良いプラクティス(および最速の方法を行うことができます)を読み取ることができますか? – Pubby

1

ログファイルのポイントの一部は、プログラムが問題に遭遇したときに何が起きたかを把握することができます。非常に少数の人々も(近く)リアルタイムでログファイル分析を行います。 2つ目のシナリオは、どちらのシナリオでも機能しません。

私は最初のアプローチから始めましたが、十分に高いレベルのインターフェイスで、本当に必要な場合は2番目のインターフェイスに切り替えることができます。私はそのスイッチを高水準インターフェースの大きなメリットとは見なしませんでした。本当のメリットは、通常はコードの残りの部分を少しきれいに保つことです。

1

あなたのプログラムにログメッセージをバッファリングし、終了時にそれらを書き出すのは良い理由ではありません。 fprintfを使用して生成されたとおりに書き込んでください。 stdioシステムがバッファリングを行います。もちろん、これは最初からファイル(fopen)を開いて開いたままにしておくことを意味します。

1

ログファイルの場合、プログラムがクラッシュすると(にはが発生することが知られています)、ログ情報は安全になるように、メッセージが完了するたびにデータをディスクにフラッシュする機能的なインターフェイスが必要になります。標準的なI/Oバッファにデータを残すことは、コアダンプからデータを掘削することを意味します。これは、ディスク上の情報を安全に保つことよりも満足できるものではありません。

その他のI/Oは、1つまたは複数のログファイルを保持することによって実際に影響を受けません。おそらくいくつかのファイル記述子が失われますが、それは重大な問題ではありません。問題が発生すると、1つのログファイルに対して1つのファイル記述子を使用し、情報をログに記録できるように開いたままにします。 stderrをログファイルにマップして、使用中のファイル記述子として残すことができます。

+0

良いログシステムの例がありますか?好ましくは裸のもの? – Pubby

+0

@ペペ:[log4c](http://log4c.sourceforge.net/)があります。私はそれを使用していない。私は通常、SQLCMDプログラムの一環として、[IIUG Software Archive](http://www.iiug.org/software)から簡単に入手できる独自の 'stderr'パッケージを使用しています - あるいは直接私に連絡することができます(私のプロフィールを参照) 。 –

1

fopenによって返されたFILE *が既にバッファされていることが言及されています。ロギングの場合、おそらくsetbuf()またはsetvbuf()関数を使用してFILE *のバッファリング動作を変更する必要があります。

特に、1行ずつバッファリングモードを設定すると、各行の書き込み後に自動的にログファイルがフラッシュされます。使用するバッファのサイズを指定することもできます。

+0

良い点ですが、デフォルトでは、ほとんどのUnixでは、fopenがラインモードでファイルを開きます。 Windows/DOS環境では、ファイルをテキストモード( 'fopen(" file.txt "、" wt ")')で開く必要がありました。 –

関連する問題