C99に対応した標準Cライブラリの実装レポートを行っていきます。

プロフィール 

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

ブロとも申請フォーム 

この人とブロともになる

ホーム 全記事一覧 << 前の記事 次の記事 >>

 

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:0CM:0

コメント
コメントの投稿

管理者にだけ表示を許可する


トラックバック
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/52-1db6161f

ホーム 全記事一覧 << 前の記事 次の記事 >>

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

このブログをリンクに追加する

Powered By FC2ブログ 

Powered By FC2ブログ
ブログやるならFC2ブログ

Copyright(C) 2006 TAKAGI Nobuhisa All rights reserved.
Powered by FC2ブログ. 無料ホームページ アフィリエイト レンタルサーバー FC2ブログ 一戸建て template designed by 遥かなるわらしべ長者への挑戦.