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