2016-07-04 12 views
1

私はソケットを閉じたが、すべてのスレッドがaccept/connectにブロックされていることを通知する前に、私はユーザ固有のシグナルを送信していますが、シグナルを受信して​​いるスレッドのIDは知らない。システムコールは使用できませんkill(pid, signal)fdを開いているすべてのスレッドに信号を送る方法はありますか?

+0

http://stackoverflow.com/questions/2486335/wakeup-thread-blocked-on-accept-call – Fazlin

+0

に記載されているように 'shutdown()'を使用してください。書き込みしようとすると、SIGPIPEを送信することができます閉じたソケットに接続するか、またはソケットが閉じられていることを示す読み取り値を返すように設定します。 –

+0

しかし、UDPソケットについては、私はSIGPIPEを使用できません – Bionix1441

答えて

2

通知せずにソケットをシャットダウンするだけではどうですか?ソケットを受け入れるか読み取る際にブロックされた各スレッドは、対応するエラーを返して、必要な処理を行うことができます。

+0

私は間違っている場合、私はシャットダウンがTCPのためだけであると確信します – Bionix1441

+0

あなたは正しいです、私はあなたがUDPを使用しているのか分からなかった。次に、名前付きソケット、共有メモリなどのIPC技術を使用する必要があります。 –

0

はい。実行中のすべてのスレッドに、システムコールkill()を介してシグナルを送ることができます。 このように使用します。 キル(0、signal_id) ここで、 '0'はすべてのプロセスにブロードキャスト信号を表します。ブロードキャストされた信号に登録された「プロセス」は、さらなるアクションのために信号ハンドラを実行した。

+0

'kill()'はプロセスにシグナルを送ります。このプロセスがマルチスレッドの場合、プロセスのスレッドの1つがシグナルを受信します(ブロックされていない場合)。だから 'kill()'はシグナルを特定の***スレッドにアドレス指定するオプションではありません***。 – alk

関連する問題