2011-09-11 16 views
1

私は本質的にソケットをリッスンするためのスレッドを持っています。私は、現在accept()でスレッドをブロックしています。リスニングスレッドを終了するLinuxソケット

スレッドは現在のトランザクションを終了し、受け取りをブロックするのではなく、リッスンを停止するようにスレッドに指示しますか?

私は本当に私が持っていない場合は、非ブロッキングを行うにはしたくない...

+0

私はあなたがそれを中断することができると信じています。私はどのようにthoを知らない。それがプロセスだった場合は、SIG_INTにそれを送ることができます – Dani

+2

私は尋ねられた質問のDupeを返し、しばらく前に答えました:http://stackoverflow.com/questions/2486335/wakeup-thread-blocked-on-accept-call – selbie

+0

@ selbie-thxはそれを見ませんでした...そこに記載されているシャットダウンシステムコールが動作します... – user623879

答えて

0

http://sourceware.org/bugzilla/show_bug.cgi?id=12683

と問題の議論のために:...

を参照してくださいそれはかなりまれな出来事でなければなりませんが、それはまだ検討すべき問題ですシャットダウン()システムコールとそれは動作するようだ...

0

読みする準備が整いましたfdチェックするselect(2)コールを使用してください。

callからのファイル記述子は、ブロックされずに読み出すことができます。たとえば返されたfdのaccept()はすぐに新しい接続を作成します。

0

基本的に2つのオプションがあります.1つ目は割り込みを使用することです。つまり、 http://www.cs.cf.ac.uk/Dave/C/node32.htmlです(シグナルハンドラのセクションを参照)。これはth_killの例も示しています。

accept() shall fail if: 
EINTR 
    The system call was interrupted by a signal that was caught before a valid connection arrived. 

別のオプションは、非ブロッキングソケットとselect()を使用することです::manページを受け入れてから、

すなわち: http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzab6%2Frzab6xnonblock.htm

とにかく、通常はマルチスレッドサーバにあります新しい接続を受け入れる一つのスレッド各接続ごとに他のスレッドを生成します。 accept()とrecv()より、新しい接続要求を遅らせることができます。(クライアントを1つ扱っていない場合はaccept()を実行してもOKです)

+0

ええ、ちょうど1人のクライアントしか持っていないgaurunteed ...私はshutdown()システムコールを使用しています...複雑ですそれはシグナルハンドラで.. – user623879

+0

accept()を正常に終了する唯一の方法であることがわかっているので、シグナルハンドラは本当に簡単です。シグナルハンドラを作成する必要はありません(受け入れを本当に終わらせたい場合、そしてシグナルハンドラを書くことさえ、sigactionのために4行+ 3行のようなものを取るでしょう....) –

0

pthread_cancelを糸。リソースがリークするのを防ぐには、適切なキャンセルハンドラ(pthread_cleanup_push)をインストールしておく必要があります。また、acceptコールの期間を除いてキャンセルを無効にして、キャンセル要求が後でacceptとは異なる機能です。

glibcのキャンセルの実装のバグにより、この方法では接続が失われ、ファイル記述子のリークが発生する可能性があることに注意してください。これは、glibc/NPTLがacceptが実行を終了しておらず、キャンセル要求が行われる前に新しい接続に新しいファイル記述子を割り当てることを保証していないためです。私はちょうど使用Wake up thread blocked on accept() call

からImplementing cancellable syscalls in userspace

関連する問題