3

th1、th2の2つのスレッドを持つデーモンがあります。th2は、を使用してソケットを読み取りますread(2)

でデーモンを強制終了するとSIGTERM、th1はシグナルをキャッチして処理し(終了フラグを設定します)、その後、デーモンデストラクタが呼び出され、を呼び出しますpthread_kill(th2, SIGTERM)。ただし、2番目のスレッドはを受信しないため、強制終了SIGTERMされません(ソケットがデータを受信して​​から抜けるとread()、終了フラグが設定されているため、実行が終了します)。

を呼び出しpthread_kill(th2, SIGUSR2)てから、を呼び出すとpthread_kill(th2, SIGTERM)、すべてが正しく終了します。したがって、UNIXは結果的に同一の信号を送信することを許可していないようです。

この動作はオペレーティングシステムに依存しますか?SIGTERM指定されたスレッドが別のスレッドから受信することを確認できますか?

4

2 に答える 2

5

Unixでは、プロセスに複数の連続するシグナルを送信できますが、シグナルが近すぎて送信される場合、またはすでに保留中のシグナルが配信される前に追加のシグナルがプロセスに送信された場合は、複数のシグナルを1つのシグナルイベントに連結できます。 。

またpthread_kill()、処理対象の特定のスレッドにシグナルを送信している間、シグナルの実際の処理にはグローバルな影響があることにも注意してください(つまり、シグナルハンドラーはスレッドごとではなくプロセスごとです)。

は有効なキャンセルポイントであるpthread_cancel()ため、明示的に呼び出すことも検討してください。read()必要に応じて、キャンセルハンドラーを追加したり、キャンセルセーフではない関数を使用している場合はスレッドのキャンセル状態をブロックしたりできます。pthread_cancel() ここで使用に関するいくつかのヒントを読むことができます。

于 2011-08-03T18:17:18.273 に答える
1

比較的古風ですが効果的なアプローチは、select()とパイプを使用して、すべてのスレッドにシグナルを再ディスパッチすることです。(ブロッキングハンドルとパイプ読み取りハンドルで()を選択します)。

于 2011-08-03T18:38:41.210 に答える