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

各プロセス毎に、シグナル管理用のデータ構造を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年12月09日 (土) 23時55分06秒 JST
1