Ko-Window プログラマーズマニュアル 「シグナルについて」 ●イベントとシグナル Ko-Window の各プロセスは、外部からメッセージとしてシグナルを受けることがで きます。しかし多くの場合、アプリケーションはそのプロセス内で1つ以上のウィンド ウを開くため、Ko-Window のプロセス間の通信はイベントを指すことほとんどです。 そのためシグナルはイベントと間違われやすいので簡単にまとめておきます。 ・Ko-Window プロセス 起動するプログラムの単位で、プロセス番号(0〜31)で管理される。最大プロセス 数は標準で32、ただし再コンパイルによって拡張可能。 (→ process.h 内の MAXPROCESS) ・ウィンドウ 画面上に開くウィンドウの単位で、ツリー上の階層構造を持つ。各ウィンドウは ID (WindowID)で管理され、特に個数制限は存在しない(メモリの許す限り)。 Ko-Window のプロセスは、1つで複数のウィンドウを開くこともあれば、ウィンドウ を全く開かないこともあります(wsh.win やウィンドウマネージャーなど)。ウィンド ウに対して何かのメッセージを送るのがイベントで、プロセスに対して送られるメッ セージをシグナルといいます。 ●プロセスの終了 Ko-Window のプログラムは、特に終了を宣言しなければ必ず常駐します。サーバー に対してプロセスの終了を宣言するには WindowConnectionClose() を使います。 それに対して、ウィンドウがサーバーに終了を知らせるのが WindowClose() です。 だから WindowClose() してもプロセスが終了したわけではないので、プロセス自体は WindowConnectionClose() するまでメモリ上に残ることになります。 ●デフォルトのシグナルエントリ 各プロセスは、wlib によってデフォルトのシグナルエントリが定義されています。 デフォルトで必ず定義されているシグナルは SignalKill のみで、プロセスはこのシ グナルを受け取ったら全部のウィンドウをクローズし、プロセスを終了します。その 具体的な処理内容は、 1. そのプロセスが開いている全ウィンドウに EventClose を送信する 2. WindowConnectionClose() を実行する となっています。 ●シグナルエントリの定義 シグナルの処理ルーチンは、自分で定義して置き換えることもできます。ただしイ ベントの EventClose とは違い、SignalKill は外部から「プロセスを終了しろ」と いうメッセージであり、プロセス終了時に必ずシグナルが送られてくるわけではあり ません。混同しないよう注意して下さい。 シグナルエントリの設定は、WindowSetSingal() を使います。シグナルエントリに は、int の code と void* の buf が渡されます。これは WindowSendSignal() で渡 すパラメータと同一です。 <エントリ例> SignalExec( code, buf ) int code; void *buf; { switch( code ){ case SignalKill: : return TRUE; } return FALSE; } 戻り値はそのまま WindowSendSignal() へ返されます。 ●おまけ Ko-Window サーバーのソースでは、WindowSetSignal() は WindowSetSingal() とし て定義されています。 ~~~~~~ ~~^~~~ 最初はタイプミスかと思ったのですが、どのソースでも Singal で統一されているの でこれが正式名称のようです。 1995/11/22 小笠原博之 oga@dgw.yz.yamagata-u.ac.jp DenDenNET: DEN0006 COR.