私は本質的にソケットをリッスンするためのスレッドを持っています。私は、現在accept()でスレッドをブロックしています。リスニングスレッドを終了するLinuxソケット
スレッドは現在のトランザクションを終了し、受け取りをブロックするのではなく、リッスンを停止するようにスレッドに指示しますか?
私は本当に私が持っていない場合は、非ブロッキングを行うにはしたくない...
私は本質的にソケットをリッスンするためのスレッドを持っています。私は、現在accept()でスレッドをブロックしています。リスニングスレッドを終了するLinuxソケット
スレッドは現在のトランザクションを終了し、受け取りをブロックするのではなく、リッスンを停止するようにスレッドに指示しますか?
私は本当に私が持っていない場合は、非ブロッキングを行うにはしたくない...
:http://sourceware.org/bugzilla/show_bug.cgi?id=12683
と問題の議論のために:...
を参照してくださいそれはかなりまれな出来事でなければなりませんが、それはまだ検討すべき問題ですシャットダウン()システムコールとそれは動作するようだ...
基本的に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です)
ええ、ちょうど1人のクライアントしか持っていないgaurunteed ...私はshutdown()システムコールを使用しています...複雑ですそれはシグナルハンドラで.. – user623879
accept()を正常に終了する唯一の方法であることがわかっているので、シグナルハンドラは本当に簡単です。シグナルハンドラを作成する必要はありません(受け入れを本当に終わらせたい場合、そしてシグナルハンドラを書くことさえ、sigactionのために4行+ 3行のようなものを取るでしょう....) –
pthread_cancel
を糸。リソースがリークするのを防ぐには、適切なキャンセルハンドラ(pthread_cleanup_push
)をインストールしておく必要があります。また、accept
コールの期間を除いてキャンセルを無効にして、キャンセル要求が後でaccept
とは異なる機能です。
glibcのキャンセルの実装のバグにより、この方法では接続が失われ、ファイル記述子のリークが発生する可能性があることに注意してください。これは、glibc/NPTLがaccept
が実行を終了しておらず、キャンセル要求が行われる前に新しい接続に新しいファイル記述子を割り当てることを保証していないためです。私はちょうど使用Wake up thread blocked on accept() call
私はあなたがそれを中断することができると信じています。私はどのようにthoを知らない。それがプロセスだった場合は、SIG_INTにそれを送ることができます – Dani
私は尋ねられた質問のDupeを返し、しばらく前に答えました:http://stackoverflow.com/questions/2486335/wakeup-thread-blocked-on-accept-call – selbie
@ selbie-thxはそれを見ませんでした...そこに記載されているシャットダウンシステムコールが動作します... – user623879