の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 とプロセス信号マスクの両方によってマスクされた信号は、プロセス信号マスクから削除されますか?
いいえ。元の信号マスクが復元されます。前にブロックされたものは後でブロックされます。