0

ハンドラーの実行時に (sa_mask を使用して) シグナルが発生しないようにマスクできることを認識しています。ただし、いくつかのグローバル変数を更新しているときにシグナルをマスクする方法を知りたいです。

また、特定のユーザー定義関数が実行されているときに信号をマスクする方法を知りたいです。

この2点は可能でしょうか?

どんな助けでも大歓迎です

ありがとう

4

2 に答える 2

0

"signal()" はいつでも呼び出すことができます。a) シグナル ハンドラーをカスタム コードに設定するか、b) ハンドラー引数を NULL に設定してクリアします。

もちろん、 sigaction()を使用すると、さらにきめ細かい制御が可能になります。いつでも (たとえば、グローバル変数を更新する前に) sigaction を呼び出すこともできます。

このリンクは役立つかもしれません:

http://www.linuxjournal.com/article/6483

于 2011-10-02T03:35:46.653 に答える
0

でシグナルをブロックすることができsigblock()ます。ブロックされたシグナルはキューに入れられ、シグナルのブロックが解除されると解放されます。

ただし、これは非常に高価です。ブロックするには syscall を実行し、ブロックを解除するには syscall を実行する必要があります。頻繁に行う場合、これは非常に遅くなる可能性があります。したがって、いくつかの代替アプローチがあります。

  1. Linux を使用している場合は、signalfdを使用します。すべてのシグナルを一度ブロックしてファイル記述子にリダイレクトし、安全なときにいつでも処理できます。
  2. それ以外の場合 (または非同期シグナル処理が重要な場合) は、ユーザー空間でシグナルを延期できます。クリティカル セクションに入る前に、volatileフラグを設定します。シグナル ハンドラーで、このフラグを確認します。見つけたら、信号番号にwrite()行き、pipeすぐに戻ってください。シグナル ハンドラーで、このパイプのシグナルを確認し、raiseその時点でシグナルを再確認します。
于 2011-10-02T03:43:00.780 に答える