|
|
|
| 2008/10/07 11:48||▲
|
|
|
前回までで、ようやく<string.h>ヘッダを終えることができました。今回からは<signal.h>ヘッダの実装に入ります。
<signal.h>ヘッダで扱うシグナル処理は、最低限の実装だけで済ませると、ほとんど使い物にならず、規格との互換性のためだけに存在することになってしまいます。かといって、POSIX互換のような実装を行うのは、今回の目的を大きく超えています。
そこで、μITRON 4.0仕様に元々備わっているタスク例外の機能と組み合わせることで、(他の実行環境との)移植性を保ちながら、アプリケーションを作成できる程度のものにとどめることにします。すなわち、タスク例外を直接扱うと、μITRON以外の実行環境への移植性が損なわれますので、それをうまく回避できるようなものにしていきます。
とりあえずは、型とマクロの定義から行います。
まずは、sig_atomic_t型の定義です。この型は、アトミックオペレーションとして読み書きを行うことができる整数型ですが、以前、<stdint.h>ヘッダで定義されるSIG_ATOMIC_MAXおよびSIG_ATOMIC_MINの実装で、H8/300のときはshort型、それ以外はint型にすると決めました。
そこで、次のように型定義を行うことにします。
#ifdef __H8300__ typedef short sig_atomic_t; #else typedef int sig_atomic_t; #endif
次に、signal関数の第2引数または返却値となるSIG_〜マクロの定義です。これは、他の関数へのポインタと同じ値にならなければよいので、次のように定義します。
#define SIG_DFL ((void(*)(int))0) #define SIG_IGN ((void(*)(int))1) #define SIG_ERR ((void(*)(int))2)
SIG_ERRは-1に定義される場合が多いのですが、ユーザ定義のシグナル処理ルーチンかどうかの判定を簡略化し、呼び出し効率を上げるためにあえてこのようにしています。また、H8の場合、0番地からベクタテーブルが割り付けられているため、これらの値が他の関数へのポインタと合致することもありません。
定義すべきマクロの最後は、signal関数およびraise関数の第1引数となるSIG〜マクロです。SIG〜マクロは、処理系が独自に追加してもよいのですが、ここでは最小限の内容にとどめます。これらのマクロの値は、1以上の整数でなければならないので、単純に連番をあてることにします。
#define SIGABRT 1 #define SIGFPE 2 #define SIGILL 3 #define SIGINT 4 #define SIGSEGV 5 #define SIGTERM 6
後は、signal関数とraise関数の宣言が必要です。関数の詳細については、例によって、個別にお話したいと思います。
|
| 2006/05/05 12:07|シグナル処理|TB:0|CM:0|▲
|
|
|
コメント
|
|
コメントの投稿
|
|
|
|
|
トラックバック
|
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/52-1db6161f
|
|
|
|
|
ホーム
全記事一覧
<< 前の記事
次の記事 >>
|