# マニュアルページ interrupt.3

## 名前

         interrupt - Interrupt_handler - タスクライブラリ用のシグナル
         処理

## 形式

         #include <task.h>
         class Interrupt_handler : public object {
         public:
              // 公開されたコンストラクタ
              Interrupt_handler(int signo);
              // 公開された仮想関数
              virtual int pending();
         private:
              // 非公開仮想関数
              virtual void interrupt();
         };

## 機能説明

         クラス Interrupt_handler により、あるタスクに外部 UNIX シ グ
         ナ ルを待機させることができます。このクラスは、クラス object
         から派生したもので、各タスクはハンドラ・オブジェクト上で待機
         することができます。

         Interrupt_handler ih(signo);
              シグナル番号 signo ( signal(3c) 参照) を待機する新し い
              割 り込みハンドラ ih を作成します。そのシグナルが発生す
              ると、非公開 (private) の仮想関数 interrupt() が通常 の
              UNIX シグナル機構を介して直ちに呼び出されます。この関数
              が返ると、割り込まれていたタスクが再開します。 す な わ
              ち、 割り込みによってタスクモデルの内部に先取り処理が発
              生することはありません。

              タスクシステムによって、特殊なタスクの 1 つである「割り
              込 み通知タスク」(interrupt alerter) が自動的に作成され
              ます。動作中のタスクが中断したとき、前回の中断以後割 り
              込 みが発生していると、割り込み通知タスクがスケジューリ
              ングされます。通知タスクは、その最後の実行以後発生し た
              すべての割り込みに対応する Interrupt_handler に警告を送
              信します。これにより、そのようなハンドラを待機してい る
              タスクはどれでも実行可能になります。

              割り込みハンドラが存在しない場合、実行対象のタスクが な
              く なるとスケジューリング・プロセスは終了します。割り込
              みハンドラが存在するかぎり、スケジューリングが終了す る
              こ とはありません。発生する可能性がある割り込みがいつま
              でも待機されます。

         int i = ih.pending();
              割り込み発生後初めて呼び出された場合を 除 い て、 常 に
              「真」(ゼロ以外の値) を返します。

         void interrupt()
              これは、非公開仮想関数の 1 つです。基底クラスバージョン
              は何も行いません。通常、 Interrupt_handler の派生クラス
              を用意し、そのクラスに適した処理を行うようにこの関数 を
              定 義してください。例については、チュートリアルを参照し
              てください。

## 診断

         task(3C++) を参照。

## 関連項目

         task.intro(3C++)、 queue(3C++)、 task(3C++)、
         tasksim(3C++)、 signal(3c)