TIPS/Linux/signal/シグナルハンドラ処理の制限

Last-modified: 2007-02-15 (木) 09:00:37

http://www.linux.or.jp/JF/JFdocs/Secure-Programs-HOWTO/signals.html

  • 「シグナルを処理している時に、他のシグナルが発生したらどうなるか?」という根本的な問題を抱えています。
    • 多重シグナル割り込みが可能である
  • 通常はシグナルハンドラをどれもできるだけ短くかつ単純にし、競合状態に注意を向けてください。シグナルはそもそも非同期に発生するので、恐らく競合状態が起こるでしょう。
  • 可能な限りどんな場合でも、シグナルハンドラは特定のフラグを設定するだけにして、他に何もさせないようにしてください。
  • より複雑なシグナルハンドラを実装せざるを得ないなら、シグナルハンドラで使用しても安全である、特に指定があるものだけを利用するようにしてください。特に、C の malloc() や free()(シグナルから保護されていないシステムが大半) だけでなく、malloc() と free()に依存しているたくさんの関数(printf() ファミリーや syslog()等)を使用しないでください。「ラッパー」を作って、安全でないライブラリを呼び出すことも可能です。ラッパーで再入を防ぐためにグローバルなフラグをチェックします。しかしお勧めはしません。
  • プログラム中でアトミックでない操作を行っている間は、シグナル送出をブロックし、シグナルハンドラ内部でもシグナル送出をブロックしてください。