マニュアルページ 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)