2012-03-24 9 views
0

Cで永遠に(クライアントサーバーのもの)実行すると思われるプログラムを書いています。ログに書き込んでいます。私はfopenfprintfを使ってファイルに書き込むことができます。私の問題は、プログラムが永遠に走っていると思われるので、実際にfcloseを置くことはできません。そして、Ctrl + Cプロセスを停止すると、ログファイルに何も表示されません?私はfprintfを使用したいのですが、私はフォーマットされた文字列を持つことができます。プログラムが実行されている間にfprintfを読む

答えて

4

何が起こっているのは、出力がバッファされていることです。プログラムが強制終了されると、バッファは決してディスクにフラッシュされません。定期的にバッファをフラッシュ(fflush)するか、killシグナルをキャプチャすることができます。具体的には、Control + CはSIGINT信号を送信するので、ハンドラを登録する必要があります。

潜在的なバッファ損失を最小限に抑えるため、おそらく両方の戦略を使用します。

How can I catch a ctrl-c event? (C++)

編集:アダムが言ったように、あなたもちょうど開くことができますし、必要に応じてファイルを閉じますが、あなたが書いている頻度に応じて、あなたが、その場合には、オープン私の答えを、ファイルを保存しておきたいこと適用されます。

+0

私は実際にはかなり頻繁に書いているので、実際に何が起こっているのか教えてくれてありがとうと思います。私は両方の方法を試してみます – user1289479

+1

定期的にフラッシュするだけでは、次回のフラッシュ前にプログラムがダウンする可能性があります。信号を捕まえようとすると、それをより良く防ぐことができます。そのため、両方が理想的です。 IOパフォーマンスに特に関心がなければ、毎回の書き出しの後にfflushすることができます。カーネルと物理ディスクのキャッシュがどの程度積極的に行われているかに応じて、書き込みごとにfflushが実際にはパフォーマンスに与える影響はごくわずかです。 – Corbin

1

ログメッセージを書き込むたびに、ファイルを追加モードで開き、テキストをファイルの最後に印刷して閉じます。

1

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)は、すべての出力ストリームをフラッシュします。

+0

+1非常に徹底的な答え! – Corbin

0

私はコービンの答えにつきますが、フォーマットされた出力を得る別の方法があるかどうか尋ねました。

あります:charバッファにsprintf()を使用して、バッファなしのopen/write/close I/Oを使用できます。

しかし、しないでください。 fopen()とco。を使って、SIGINTを捕まえる。

関連する問題