Cで永遠に(クライアントサーバーのもの)実行すると思われるプログラムを書いています。ログに書き込んでいます。私はfopen
とfprintf
を使ってファイルに書き込むことができます。私の問題は、プログラムが永遠に走っていると思われるので、実際にfclose
を置くことはできません。そして、Ctrl + Cプロセスを停止すると、ログファイルに何も表示されません?私はfprintf
を使用したいのですが、私はフォーマットされた文字列を持つことができます。プログラムが実行されている間にfprintfを読む
答えて
何が起こっているのは、出力がバッファされていることです。プログラムが強制終了されると、バッファは決してディスクにフラッシュされません。定期的にバッファをフラッシュ(fflush)するか、killシグナルをキャプチャすることができます。具体的には、Control + CはSIGINT信号を送信するので、ハンドラを登録する必要があります。
潜在的なバッファ損失を最小限に抑えるため、おそらく両方の戦略を使用します。
How can I catch a ctrl-c event? (C++)
編集:アダムが言ったように、あなたもちょうど開くことができますし、必要に応じてファイルを閉じますが、あなたが書いている頻度に応じて、あなたが、その場合には、オープン私の答えを、ファイルを保存しておきたいこと適用されます。
ログメッセージを書き込むたびに、ファイルを追加モードで開き、テキストをファイルの最後に印刷して閉じます。
setbuf()、setvbuf()、またはfflush()、 - トラップSIGINT
またはシステムに関して適切なもの。
e.e.e.他のコンソールに
#include <stdio.h>
#include <unistd.h> /* for sleep() in this example */
int main(void)
{
FILE *fh;
char *fn = "main.log";
int i;
if ((fh = fopen(fn, "w")) == NULL) {
fprintf(stderr,
"Unable to open file %s\n", fn);
return 1;
}
setbuf(fh, NULL); /* Turns buffering completely off */
for (i = 1; ; ++i) {
fprintf(fh, "%d ok ", i);
if (!(i%120))
fprintf(fh, "\n");
sleep(1);
}
fclose(fh);
return 0;
}
:
$テールmain.log -f
収量: 1 OK 2 OK 3 OK 4 OK 5 OK 6 OK^C
または書き込みバッファをフラッシュする場合はfflush(fh)
となります。
stdio.h:ストリームストリーム用>
int setvbuf(FILE* stream, char* buf, int mode, size_t size);
コントロールバッファリング。モードは、フルバッファリングの場合は_IOFBF、ラインバッファリングの場合は_IOLBF、バッファリングがない場合は_IONBFです。 null以外のbufは、使用するサイズ・サイズのバッファを指定します。それ以外の場合は、バッファが割り当てられます。エラー時にゼロ以外の値を返します。 ストリームの他の操作の前にコールする必要があります。ストリームストリームの
void setbuf(FILE* stream, char* buf);
コントロールバッファリング。 null bufの場合、バッファリングをオフにします。そうでない場合は、(void)setvbuf(stream、buf、_IOFBF、BUFSIZ)と等価です。
int fflush(FILE* stream);
をフラッシュストリームstreamとは、エラーの成功またはEOFにゼロを返します。入力ストリームに対して未定義のエフェクトです。 fflush(NULL)は、すべての出力ストリームをフラッシュします。
+1非常に徹底的な答え! – Corbin
私はコービンの答えにつきますが、フォーマットされた出力を得る別の方法があるかどうか尋ねました。
あります:charバッファにsprintf()を使用して、バッファなしのopen/write/close
I/Oを使用できます。
しかし、しないでください。 fopen()とco。を使って、SIGINTを捕まえる。
- 1. スラッシュスクリーンが表示されている間に読み込むWebview
- 2. iframeがロードされている間にjavacriptを実行する
- 3. 他のコマンドが実行されている間にタイマーを実行するC++
- 4. CPPプログラムが実行されない
- 5. Swift-iOSプログラムが実行されない
- 6. メソッドがPythonで実行されている間の実行時間の表示
- 7. SetWindowsHookEx、マウスボタンが押されている間にコードを実行
- 8. Docker:別のコマンドが実行されている間にコマンドを実行
- 9. サブプロセスが実行中にstderrを読む
- 10. fadeIn/FadeOutが実行されている間に他のスクリプトが実行されないようにします
- 11. DirectX9 C++ - ウィンドウが最小化されている間にテクスチャを読み込む
- 12. プログラム内でないIDLEでPythonプログラムが実行される
- 13. スパークが既に実行されているときに新しいテキストファイルを読み込むには?
- 14. RPC Cプログラムでfprintfが発生する
- 15. 特定のプログラムが実行されている場合にのみ、スケジュールされたWindowsタスクを実行
- 16. デバッグがスムーズに実行されている間に奇妙なプログラムがクラッシュする(Elipse C++)
- 17. プログラムを実行しているときにビジュアルスタジオにコマンドウィンドウが表示される
- 18. パイプされたプログラムの実行時間を制限する
- 19. 指定された時間プログラムを実行する方法は?
- 20. 実際の画像がダウンロードされている間に画像を読み込む方法
- 21. アプリが実行されていない間にPhoneGapの通知
- 22. プログラムが実行されている間に名前をファイルに名前を変更
- 23. Javaプログラムが実行されていないとき
- 24. 外部プログラムが実行されていないメニュー
- 25. Ns2のプログラム(シミュレーションプログラムが実行されていない)
- 26. VBAプログラムが正しく実行されていない
- 27. Pythonプログラムが期待どおり実行されていない
- 28. jMeterスレッドが実行されている時間を取得
- 29. 別のプログラムが実行されているときにプログラムが起動しないようにする(Windows)
- 30. 長時間実行しているGoプログラムを実行するにはどうすればよいですか?
私は実際にはかなり頻繁に書いているので、実際に何が起こっているのか教えてくれてありがとうと思います。私は両方の方法を試してみます – user1289479
定期的にフラッシュするだけでは、次回のフラッシュ前にプログラムがダウンする可能性があります。信号を捕まえようとすると、それをより良く防ぐことができます。そのため、両方が理想的です。 IOパフォーマンスに特に関心がなければ、毎回の書き出しの後にfflushすることができます。カーネルと物理ディスクのキャッシュがどの程度積極的に行われているかに応じて、書き込みごとにfflushが実際にはパフォーマンスに与える影響はごくわずかです。 – Corbin