ハンドラーの実行時に (sa_mask を使用して) シグナルが発生しないようにマスクできることを認識しています。ただし、いくつかのグローバル変数を更新しているときにシグナルをマスクする方法を知りたいです。
また、特定のユーザー定義関数が実行されているときに信号をマスクする方法を知りたいです。
この2点は可能でしょうか?
どんな助けでも大歓迎です
ありがとう
ハンドラーの実行時に (sa_mask を使用して) シグナルが発生しないようにマスクできることを認識しています。ただし、いくつかのグローバル変数を更新しているときにシグナルをマスクする方法を知りたいです。
また、特定のユーザー定義関数が実行されているときに信号をマスクする方法を知りたいです。
この2点は可能でしょうか?
どんな助けでも大歓迎です
ありがとう
"signal()" はいつでも呼び出すことができます。a) シグナル ハンドラーをカスタム コードに設定するか、b) ハンドラー引数を NULL に設定してクリアします。
もちろん、 sigaction()を使用すると、さらにきめ細かい制御が可能になります。いつでも (たとえば、グローバル変数を更新する前に) sigaction を呼び出すこともできます。
このリンクは役立つかもしれません:
でシグナルをブロックすることができsigblock()
ます。ブロックされたシグナルはキューに入れられ、シグナルのブロックが解除されると解放されます。
ただし、これは非常に高価です。ブロックするには syscall を実行し、ブロックを解除するには syscall を実行する必要があります。頻繁に行う場合、これは非常に遅くなる可能性があります。したがって、いくつかの代替アプローチがあります。
volatile
フラグを設定します。シグナル ハンドラーで、このフラグを確認します。見つけたら、信号番号にwrite()
行き、pipe
すぐに戻ってください。シグナル ハンドラーで、このパイプのシグナルを確認し、raise
その時点でシグナルを再確認します。