2012-03-07 7 views
-1

私はサーバークライアントアプリケーションを作成しました。さて、サーバー上で何が起こったかをログファイルに書き留めなければなりません。サーバーはCで書かれています。私はすでにprintfを使って画面に何が起こるかを書いています。マルチスレッドアプリケーションでファイルにログを書き込む

だから、printfの代わりにfprintfを使うだけでいいです。私の質問は、ファイルをどのように扱うべきかです。

私は主な機能

がここにありServer.cソースファイルを持っているが、私のサーバーアプリケーションの基本的な構造である:

Server.c

//.. some code 
int main(...) { 
//some code 
//initialize variables 
//bind server 
//listen server on port 
    while(1) 
    { 
    //accept client 

    int check = pthread_create(&thread, NULL, handle_client,&ctx);//create new thread 

    //.. 
    }//end while 
return EXIT_SUCCESS; 
}//end main 

handle_clientが関数でありますこれは新しいスレッドでクライアントを処理します。

サーバーログはどのように作成する必要がありますか?たとえば、SERVERLOG.logのようなテキストファイルが1つありますが、サーバーには多くのクライアントがあります。このファイルへの複数のアクセスをどのように処理する必要がありますか?

1つの方法は、サーバーを起動し、開いて、書き込んで、閉じるときにファイルを作成することです。 クライアントがファイルに書き込もうとしている場合は、ファイルを書き込んで書き込んで閉じます。

しかし、より多くのクライアントは、このファイルに書きたいの問題がまだある....

+0

私はこれを少し知っていますが、私はあなたの質問を編集しました。たとえあなたの英語がうまくいかなくても、できるだけ努力していれば、これをテキストプロセッサーにコピーして単純な間違いを修正するだけでした。 – Mansuro

答えて

0

ただ、それを開いたままにします。サーバーの起動時にログファイルを開きます。

3

一般的な解決策は、すべての出力を最初にバッファに書き込み、次にセマフォをロックし、実際の書き込みをファイルに行い、セマフォをロック解除するという機能です。実際の文章が遅くなることを心配している場合は、代わりに、すべてのログメッセージが挿入されるキューを作成し、別のスレッドがキューからアイテムを取り出してファイルに書き込むようにすることができます。セマフォーですが、I/Oを行う方が速いはずです。

実際のファイルは、メインスレッドで開き、開いたままにします。または、キューを持つ特別なロギングスレッドがある場合は、そのスレッドにオープンをさせます。とにかく、何かを書いておきたいときは毎回それを開いたり閉じたりする必要はありません。重要なのは、複数のスレッドが同時に書き込むのを防ぐことです。

+0

Thx、ハンドルクライアント用のスレッドを使用しているのは私にとって恐ろしいことです。だから別のスレッドで処理するよりも、おそらくセマフォとの最初のアドバイスを使用します。しかし、私はあなたのfirsのアドバイスに別の質問があります - バッファについて、セマフォがロックされている場合はどうなりますか?すでにバッファーに入っていますか? – user1097772

+0

@ user1097772バッファをローカル変数( 'char buffer [256]'のような)だけにしておくと、スレッドにとって事実上ローカルになります。セマフォがロックされている場合、メッセージを破棄するか、少し待ってからメッセージを破棄するか、スレッドが回転するまで待ってください。 –

+1

あるいは、既存の 'printf'のような関数を使うことができます。 "[FILE *]オブジェクトを参照するすべての関数は' flockfile() 'を使うように振る舞うでしょう[標準](http://pubs.opengroup.org/onlinepubs/000095399/functions/flockfile.html)を参照してください。 'funlockfile()'を内部的に使用してこれらの 'FILE *'オブジェクトの所有権を取得します。 –

0

不良なインターレース出力バッファを避ける簡単な方法は、パイプ(または名前付きパイプ)で接続された別のログ処理を使用することです。ロガーはパイプからread()でブロックされ、ファイルに得られたものを書き出します。 (読者の標準では、stdoutは実際にパイプとファイルを指すことができます)クライアントはパイプに書き込みます(dup(d)をstderrより上にすることができます)。パイプへの書き込み(PIPE_BUFまで)はアトミックであることが保証されます。

関連する問題