* lib_getsigのページ -(2004.05.05 by [[K]]) -みんなのソースを見ていると、誰もがgetsignal()やgetsignalw()を作って使っています。しかし中身は僕が作ったときのままで、手を加えたものを見たことがありません。 -これを考えて僕は反省しています。確かにgetsignalにほとんど創意工夫の余地がありません。そんなものを毎回書かせていたことは、ソースをむやみに長くして読みにくくしていただけでしょう。 -ということで、lib_getsig系の関数を作りました。良かったこれを使ってください。またintroでの説明も順次こちらの説明に切り替えようと思っています。また、たいていの場合、lib_getsig系を使うほうがコンパクトで速くなります(わずかな差ですが)。 *** ダウンロード -osa_dir3以降にバンドルされますが、osa_dir3が出るまで待つ必要はないので、待てない人はこちらからどうぞ。 --http://k.hideyosi.com/test061.lzh (18.8KB) * 関数一覧 -lib_initsignalbox系 --lib_initとlib_opensignalboxをくっつけたもの。 --だからこれ一つでlib_initもlib_opensignalboxも不要。 --これはmallocしないので、malloc領域の計算で数えなくてよい。 --lib_getsig系を使うにはこの関数でシグナルボックスを初期化するか、もしくは特定の書式でシグナルボックス構造体を構成する必要がある。 --従来どおりユーザが自作したgetsignal等を使うのなら、この関数を使う必要もシグナルボックス構造体を作る必要もない。 --シグナルボックスのサイズに応じて関数名にバリエーションがある。どれか一つを選ぶ(将来的には1k版と16k版も作る予定)。 --lib_initsignalbox0_256(int rewind); --lib_initsignalbox0_4k(int rewind); --lib_initsignalbox0_64k(int rewind); -lib_getsig系 --末尾にwが付いているのは、シグナルがくるまで待ってくれる関数である。相当の動作は以下を参照。w版では、関数値が0になることはない。 --lib_getsig0(int *sigbox); --lib_getsig0w(int *sigbox); --lib_getsig1(int *sigbox); --lib_getsig1w(int *sigbox); --0版と1版の違いは、次の通り。 ---ノーマル版とw版のどちらかしか使わないのなら、0版を使うほうが高速かつコンパクト(ほとんどのプログラムはこちらに該当)。 ---ノーマル版とw版の両方を使うなら、1版を使うほうが高速かつコンパクト。 -w版の動作説明用ソース int getsignalw() { int sig; retry: sig = getsignal(); if (sig == 0) { lib_waitsignal(0x0001, 0, 0); /* シグナルがくるまでsleep */ goto retry; } return sig; } * 使用例 * こめんと欄 #comment