2012-02-10 6 views
0

この質問の基本は申し訳ありませんが、ここで問題が発生しています。クライアント/サーバープログラムがあります。私は手前でどのくらいの接続が来るかわからないが、無限ではない。そして最後に、すべての接続が閉じられた後、いくつかの結果が出力されます。しかし、私が抱えている問題は、接続を受け入れることが無限ループの中にあることです。結果を出力するにはどうしたらいいですか?あなたはxの任意の新しいクライアントを取得しない場合は、あなたのループから抜け出すために条件のいくつかのフォームを持っている必要がありクライアントサーバープログラムを停止する

おかげ

+4

whileループのコードを投稿できますか? – Brian

答えて

1

は、あなたのケースでは、タイムアウトはおそらく、基本的には意味、最高の仕事だろう秒、あなたはクライアントを探すのをやめ、接続エラーのために同じことが起こります。

これ以上使用するコードを見る必要があります。

+0

はタイムアウトを考えていました...ありがとう –

1

取り扱いEINTRaccept(2)からエラーが発生し、プログラムを終了して^Cを押すと、通常動作します。

0

あなたはグローバルvolatile sig_atomic_t変数を設定しますSIGTERMシグナルのハンドラをインストールすると、お使いの多重ループ内でその変数をテストすることができ(おそらく周りpollまたはselect)。 signalハンドラは多くの関数を呼び出すことはできません(の非同期シグナルセーフの関数のみ)。

ほとんどのLinuxまたはPosixサーバーでは、よくキャッチするSIGTERMが予想されます。

あなたはlibevのようなライブラリを扱う場合、libeventなどを使用して検討することもでき

私の背景には、Windows NTで機能「名前」ですが
0

任意のマルチで利用可能であるべきで、一般的なスレッドやプロセスの機能に名前を付けるものですスレッド環境。

メインスレッドが問題の子スレッドをいつ終了させるべきかを判断できるのであれば、 "terminate_conditon"のように子スレッドループをブール値にするか、ハンドルをスレッドで終了させることができます。

// child thread 

terminate_condition=FALSE; 
while (!terminate_condition) 
{ 
    // accept connections 
} 
child_thread_done=TRUE; 
// output results 
exit_thread(); 

// main thread 

child_thread_done=FALSE; 
child_thread=create_thread (...); 

// monitor connections to determine when done 

terminate_condition=TRUE; 
while (!child_thread_done) 
{ 
    sleep (1); 
} 
// or maybe output results here? 
exit_process(); 

この制御停止液は、1つのスレッドだけchild_thread_doneブールに書き込み、他のスレッドが唯一読み取るようにする必要があります。

それとも

// child thread 

while (1) 
{ 
    // accept connections 
} 

// main thread 

child_thread=create_thread (...); 

// monitor connections to determine when done 

kill_thread (child_thread); 
// output results 
exit_process(); 

それは単純に子スレッドを殺すため、2番目の形式はメシエです。一般的には、子スレッドに制御された終了を実行させる方がよい(特に、スレッドを割り当てるのではなく、プロセス全体の責任となる)

接続で動作する子スレッドが多数ある場合、同期終了メカニズムが必要です。子スレッドと同数のメンバーを持つ構造体(終了スレッドは、 "terminated"ブール値をtrueに設定し、終了し、メインスレッド構造体を監視して、処理前にすべての子「終了」ブール値が真であることを確認する)、または子スレッドが動作している回数を含むカウンタ(子プロセスが終了しようとしているときにスピンロックによってカウンタを排他制御し、終了前のロック:カウンタがゼロを含む前にメインスレッドは何もしません)。

関連する問題