INTERRUPT(3C++)

名前
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)