2011-11-07 8 views
1

私はCでマルチスレッドアプリケーションを作成しました。すべてのシグナルを捕捉するためのものとクライアント接続のaccept()-を作成するものの2つのスレッドが作成されています。 killprocを使用してアプリケーションを終了すると、accept呼び出しのスレッドは中断されません。どうすれば修正できますか?あなたが中断システムコールの使用を参照してくださいここでブロッキングaccept()コールを中断する方法

int stop_exec=0; 

sigCatcherThread() 
{ 
    int sig 
    sigset_t allsignals; 
    sigfillset(allsignals); 

    do{ 
      sigwait(&allsignals, &sig); 
      if(sig==SIGTERM) 
      stop_exec=1; 
    }while(!stop_exec) 

} 

clientHandler() 
{ 
    ... 
    while(!stop_exec) 
    { 
     accept(...); 
    } 

main() 
{ 
    pthread_create(..., sigCatcherThread,..); 
    pthread_create(..., clientHandler,...); 
} 
+0

** self-pipe trick **を使用してください。[here] [1]を参照してください。 [1]:http://stackoverflow.com/questions/7016977/how-can-i-cancel-a-blocking-call-such-as-select-or-read –

+0

修正するものは何もありません。信号を取得するためにスレッドが必要な理由がある場合は、それを説明してください*を修正する方法を教えてください*。 –

答えて

1

:よう

コードが見えます。しかし、信号処理スレッドの利便性は、中断されたシステムコールの使用よりもおそらく高いでしょう。

したがって、着信接続を受け入れるか、信号が発生するまでブロックするクライアントハンドラが必要です。潜在的な入力を待つということは、信号駆動型IO(I/Oが追従しない経路)か、(2)(またはプール)を選択することを意味します。しかし、select(2)はIOだけを待つことができます。パイプラインを開いてSIGQUITが発生したときにシグナル処理スレッドにパイプを書き込ませ、ソケットのためのクライアントスレッドselect(2)とパイプのもう一方のエンドを持つようにしてください。

0

1つのスレッドのみがプロセスをターゲットとする信号を受信します。したがって、それはaccept()でブロックされたスレッドでなければなりません。詳細はsignal conceptsを参照してください。

既に説明したように、おそらくselect()に基づくイベントループを使用しているはずです。私はlibeventを使用することをお勧めします。

0

ブロックacceptコールを中断する必要はありません。スレッドがacceptから返ってきた場合、実際の接続を受け取るなどして何も有害ではないことを確認してください。

accept割り込みの呼び出しが必要な特定の理由がある場合は、それが何であるか説明してください。おそらく、要件を削除する簡単な方法があります。

関連する問題