こんにちは、川合です。 KOYANAGI, Masaaki さんは 2002/09/22 13:56:43 の「[OSASK 5042] Re : シグナル(ぐいぐい01).」で書きました: >cntupc3 を見ました。シグナルハンドラについては、これで分かりました。 >確認ですが、 > >(1)シグナルハンドラで 1度だけ getsignal() して処理を行っている間に、 >シグナルが発生した場合はシグナルボックスにためられ、シグナルハンドラ >からリターンした場合にすぐにシグナルハンドラが呼ばれる > >(2)ぐいぐい01 で優先順位を設定した場合に、(1)でシグナルボックス >にためられる時点で優先度の低いシグナルを落とすような処理が >行われる。 > >ということで合っているでしょうか。 どちらも完ぺきにあっています。補足することはなにもありません。 >ただ [OSASK 4121] によると、 > >>現時点でシグナルハンドラを利用したCプログラムで公開されているのは、pac >>k004sのcntupc3ですが、これはタイマーの使い方が正しくありません。 > >とのことですが、どこが正しくないのか私には分かりませんでした。 これは、タイマーの等間隔連続発生を指定しているせいです。これは 今では廃止されて、タイマーシグナルを受け取るたびに次のタイマーシ グナルの設定をするのが正しいとされています。 >#ところで、cntupc3 がどこにあるのかは OSASK-ML の過去メールに対して >#"cntupc3" のキーワードをかけて検索して pack04s にあることが分かり >#ましたが、今までに川合さんが出したサンプルは相当な数があるので、 >#目録があるといいかもしれませんね。作るのは大変ですが。 ええと、I.Tak.さんのp0crefのintrolst.txtには詳しく書いてありま す・・・って思っていたら、packシリーズだけは入っていませんでした 。どなたかがpackシリーズの分だけまとめれば、あとはI.Tak.さんがま とめてくれるかもしれません。まあ誰もやらなくて、でもとても必要と いうことなら、僕がやってもいいですが・・・。 >割り込みが必要な場合はシグナルハンドラを定義して、 > >・緊急シグナルはその場で処理 >・その他のシグナルはキューにためてリターン >・メインループでキューからシグナルを取り出して処理 > >というのが私には分かりやすそうです。 これは良いスタイルです。割り込みが必要なときは(=緊急に処理す べきシグナルを扱う上に、シグナル処理の中に長引きそうなものがある 場合)、これが最善のプログラミングスタイルだと思います。 逆に割り込み処理が不要な場合なら、なにも好きこのんで手間のかか るシグナルハンドラを使うことはありません。選べるのがぐいぐい00の いいところなんですから、楽できるところでは楽をしましょう。 >chuck1 で kill コマンドがサポートされたのですが、そこで送っている >KILL シグナルは、シグナルボックスの枠組とは別なのでしょうか? >そもそも私にはシェルから kill したり、ウインドウのクローズボタンを >押した時にタスクに何が起こって終了するのかの内部構造が分かって >いないのでその情報へのポインタか解説をしていただけるとうれしいです。 これはおもいっきり「えせ」の部分が絡んでいるのでほとんど説明し てきませんでした。まあ、「えせ」だと承知の上で(=将来的に細部が 変わることは十分にありうると知った上で)、説明を読むのも楽しいか もしれません。・・・小柳さんの興味があるうちに、おおざっぱに説明 します。 シグナルは、基本的にTAPIが管理しています。TAPIのワークエリア内 にタスクごとのTSSイメージやLDTのイメージがあるのですが、そのほか にシグナルボックスもあるわけです。このシグナルボックスは、アプリ がlib_opensignalbox()で用意するシグナルボックスとは別で、システ ムが用意している特別なものです。サイズは512バイト固定になってい ます(将来はこのサイズもシェルから制御したりするわけですが)。 どんなシグナルも、基本的にこのTAPIのシグナルボックスに溜まりま す。たとえばウィンドウの再描画要求は、[0x48, window番号]というシ グナルですし、シェルからのkill要求は[0x20, 0]というシグナルです 。またキー入力があったりすると[0x7f000001, 10]みたいなシグナルが 来ます。 このシグナルをpioneer0の中のシグナルハンドラが処理します(pion eer_softint())。そして再描画要求にこたえたり、kill要求に応じた りするわけです。このpioneer0のシグナルハンドラはTAPIに対して登録 されていて、これまたアプリが定義するシグナルハンドラとは別です。 pioneer_softint()は0x7f000001で始まるシグナルを認識すると、アプ リが設定しておいたシグナルボックスに後続のシグナルを転送します( この場合は10)。これで先の2つはアプリからは見えず、最後のキーボ ードからのシグナルだけがアプリに見えるわけです。 この説明ではややこしいかもしれません。まずTAPIだけに注目しまし ょう。TAPIにとってタスクとは、システムのシグナルボックスを持ち、 シグナルハンドラが存在するものでしかありません。シグナルハンドラ は常にあり、シグナルボックスも常にあります。 次にpioneer0に注目しましょう。システムから渡されるシグナルはか なりの種類があり、これを全てそのままアプリに処理させるとなるとア プリを作るのが大変になります。たいていは決まりきった処理で構わな いでしょう。だから、まさに小柳さんの割り込みが必要なスタイルでpi oneer0は書かれているのです。「キュー」がアプリから見たシグナルボ ックスになっているわけです。これは割り込みハンドラなので、アプリ 側が処理中であっても、ちゃんと全てのシグナルに応じることができて いるわけです。 さらにpioneer0はアプリ用のシグナルボックスを監視して、アプリの シグナルハンドラも利用できるように作ったわけです。 そしてもし小柳さんが割り込みが必要なスタイルでアプリを書けば、 結局シグナルボックスに準ずるものが3つになり、徐々にふるいにかけ られていくわけです。なんだか無駄のように見えるかもしれませんが、 それほど効率が悪いということもなく(シグナルはもともとタイミング が重要な時に使うもので、大量のデータをやり取りしたりはしないので す)、またぐいぐい01ではこの多段式を克服する方法すらあるわけです (複数のシグナルボックスをサポートすればいい・・・そうすればシス テムのシグナルボックスから間を通らないで直接分配されるようになり ます)。さらにぐいぐい01ではアプリには関係のない拡張がなされてい て(これはまだ説明していません)、効率と安全性を高められる予定で す。 それでは。 -- 川合 秀実(KAWAI Hidemi) OSASK計画代表 / システム設計開発担当 E-mail:kawai !Atmark! imasy.org Homepage http://www.imasy.org/~kawai/