シグナル関連のデータ構造と、その他の関数

各プロセス毎に、シグナル管理用のデータ構造をtask_struct構造体内に持つ。

  struct task_struct {
          :
      int sigpending       //処理すべきシグナル保留中
      sigset_t signal      //受信シグナル
      sigset_t blocked     //マスクするシグナル
      signal_struct *sig   //シグナルハンドラ登録テーブルへのポインタ
          :
  }
  • sigaddset()、sigdelset()
    • シグナル受信のフラグをON/OFF操作する。
  • sigaddsetmask()、sigdelsetmask()
    • シグナルマスク用のフラグをON/OFF操作する。
  • sigismember()
    • 指定されたシグナルに対応するフラグが立っているか否かを チェックする。
  • kill_something_info(), kill_proc(), kill_pg()
    • 指定されたプロセス、指定されたプロセスグループに属するプロセスに 対しシグナルを送信する。
    • セッションに属するプロセス群に対しシグナルを送るkill_sl()も 用意されている。
  • sys_sigprocmask()
    • シグナルマスクを変更する。(sigaddsetmask関数、 sigdelsetmask関数を利用)

捕捉 元々UNIXのシグナル機能は、killというシステムコール名からもわかるとおり走行中のプロセスを強制的に殺す程度のことしか考えられずに設計されている。

その後、次第にシグナルの機能が拡張されていき様々な機能を持つに至った。しかし使う側からは便利だが、一貫性の無い機能拡張のおかげでカーネル内のシグナルハンドリングに関する実装はかなりボロボロである。

最近は、複数のシグナルが連続して発生したとき、シグナルハンドラ起動をその発生順に行えるようにするための機能が拡張されている。


(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1