私は現在、コードの重要なセグメントが実行されているときにsigprocmask
特定のシグナル (この場合はSIGALRM
と) をブロックするために を使用することを研究しています。SIGCHLD
これらのシグナルに関連付けられた両方のシグナル ハンドラーは、中央のデータ構造にアクセスして変更するため、メイン プロセスが処理している間は、これらのシグナル ハンドラーがデータ構造にアクセスできないようにすることが重要です。
現時点では、コードのクリティカル セクションの開始時にこれらのシグナルを単純に無効にし、最後に再度有効にする予定です。
void criticalFunction(void) {
// disable signals with sigprocmask
// critical code
// enable signals with sigprocmask
}
ただし、ブロックされるシグナルのシグナルハンドラも を呼び出しますcriticalFunction
。sigprocmask
関数を呼び出して独自のシグナルでブロッキングを有効にするとどうなるでしょうか? それらは停止しますか、それとも実行を続けますか? (またはいくつかの 3 番目の条件..)
これについて私が見つけることができた唯一のメモは次のとおりです。
sigprocmask() がシグナルハンドラーで呼び出された場合、ハンドラーから戻ると、元の保留中のシグナルマスクを復元することにより、sigprocmask() の作業が取り消される場合があります。( http://www.mkssoftware.com/docs/man3/sigprocmask.3.asp )
(これは私の前の質問へのフォローアップの質問です:キューのデータ構造にアクセスするシグナルハンドラー (競合状態?) )