2

sa_maskフィールドは、struct sigactionハンドラーの呼び出し中にブロックされるシグナルを指定します。これらのシグナルは、ハンドラーが呼び出される直前にプロセス ブロック マスクに追加され、ハンドラーの完了直後に削除されます。sa_maskとプロセス信号マスクが重なっている場合はどうなりますか? とプロセス信号マスクの両方でsa_maskマスクされている信号は、プロセス信号マスクから削除されますか?

4

2 に答える 2

7

シグナル ハンドラーが戻ると、シグナルが処理される前に有効だったシグナル マスクは、戻りプロセスの一部としてアトミックに復元されます。longjmpこれは、またはを使用してシグナル ハンドラーからジャンプしない限り発生します。siglongjmpこの場合、シグナル マスクを手動で保存して復元するかどうかはユーザー次第です。

余談ですが、SA_SIGINFOフラグを使用して 3 つの引数形式のシグナル ハンドラーをセットアップするとucontext_t、3 番目の引数が指す にはsigset_t uc_sigmask、保存されたシグナル マスクを反映するメンバーが含まれます。さらに、この使用法が POSIX によって認可されているかどうかはわかりませんが、私が知っているすべての実世界のシステムではuc_sigmask、シグナル ハンドラーから戻る前に実際に変更して、別のシグナル マスクを設定することができます (元のマスクを復元するのではなく)。 ) シグナルハンドラが戻ったとき。これは、たとえば、処理したばかりのシグナルを再発生させたいが、戻ったときにブロックしたままにしておく場合に使用できます。これにより、中断されたコードによってシグナルが再びブロック解除されたとき、sigwaitinfoまたは類似の呼ばれた。

于 2011-11-07T15:45:40.277 に答える
2

sa_mask とプロセス信号マスクの両方によってマスクされた信号は、プロセス信号マスクから削除されますか?

いいえ。元の信号マスクが復元されます。前にブロックされたものは後でブロックされます。

于 2011-11-07T15:35:33.573 に答える