のsa_mask
フィールドは、struct sigaction
ハンドラーの呼び出し中にブロックされるシグナルを指定します。これらのシグナルは、ハンドラーが呼び出される直前にプロセス ブロック マスクに追加され、ハンドラーの完了直後に削除されます。sa_mask
とプロセス信号マスクが重なっている場合はどうなりますか? とプロセス信号マスクの両方でsa_mask
マスクされている信号は、プロセス信号マスクから削除されますか?
2 に答える
シグナル ハンドラーが戻ると、シグナルが処理される前に有効だったシグナル マスクは、戻りプロセスの一部としてアトミックに復元されます。longjmp
これは、またはを使用してシグナル ハンドラーからジャンプしない限り発生します。siglongjmp
この場合、シグナル マスクを手動で保存して復元するかどうかはユーザー次第です。
余談ですが、SA_SIGINFO
フラグを使用して 3 つの引数形式のシグナル ハンドラーをセットアップするとucontext_t
、3 番目の引数が指す にはsigset_t uc_sigmask
、保存されたシグナル マスクを反映するメンバーが含まれます。さらに、この使用法が POSIX によって認可されているかどうかはわかりませんが、私が知っているすべての実世界のシステムではuc_sigmask
、シグナル ハンドラーから戻る前に実際に変更して、別のシグナル マスクを設定することができます (元のマスクを復元するのではなく)。 ) シグナルハンドラが戻ったとき。これは、たとえば、処理したばかりのシグナルを再発生させたいが、戻ったときにブロックしたままにしておく場合に使用できます。これにより、中断されたコードによってシグナルが再びブロック解除されたとき、sigwaitinfo
または類似の呼ばれた。
sa_mask とプロセス信号マスクの両方によってマスクされた信号は、プロセス信号マスクから削除されますか?
いいえ。元の信号マスクが復元されます。前にブロックされたものは後でブロックされます。