1

http://pubs.opengroup.org/onlinepubs/009604499/functions/sigprocmask.html

ドキュメンテーションは、必要なすべてのシグナルがグローバル スコープ変数に格納される例を示しています (シグナル スレッドが開始される前waitに main() で入力されます。例では、シグナル スレッドはシグナルをブロックした後に開始されました。 SIG_BLOCK

main() でシグナルをブロックする にシグナル スレッドを作成し、新しく作成された他のすべてのスレッドのシグナルをブロックする場合、正しく、未定義の動作やクラッシュは発生しませんか?SIG_BLOCK

4

1 に答える 1

1

シグナル スレッドがシグナルを明示的にブロックしている限り、最終的には で待機しsigwaitますが、安全です。

たとえば、次の 2 つのフローの例はどちらも安全です。

main:
  create_signal_thread() // Inherits mask from main, so signals are not blocked.
  block_signals()        
  create_more_threads()  // Inherit mask from main, so signals are blocked.

signal_thread:
  block_signals()        // Must block signals, as this thread will wait on them.
  sigwait()              // Behavior is defined.

main:
  block_signals()        
  create_signal_thread() // Inherits mask from main, so signals are blocked.
  create_more_threads()  // Inherit mask from main, so signals are blocked.

signal_thread:
  sigwait()              // Behavior is defined.

ただし、次の例は安全ではありません。

main:
  create_signal_thread() // Inherits mask from main, so signals are not blocked.
  block_signals()        
  create_more_threads()  // Inherit mask from main, so signals are blocked.

signal_thread:
  sigwait()              // Behavior is undefined.

からの関連する抜粋は次のsigwaitとおりです。

set によって定義されたシグナルは、呼び出し時にブロックされsigwait();ます。それ以外の場合、動作は未定義です。sigwait()セット内のシグナルのシグナル アクションに対するの効果は規定されていません。

于 2012-06-21T13:36:35.673 に答える