小柳です。こんにちは。 Hidemi KAWAI wrote: > > こんにちは、川合です。 > > まず、「割り込みの必要性」の意味の確認です。 > > さて、僕は[OSASK 5018]を読んで、小柳さんがおっしゃりたいことは > もっと細かいことなのではないかと思いました。確認させてください。 > ・・・たとえばシグナルCの処理は3秒くらいかかるような大規模なもの > だったとします。この処理に入った瞬間にシグナルaが来ても、アプリ > は3秒後にしか気が付けないのではないか、という趣旨のご指摘でしょ > うか? はい。そうです。 > もう一つのやり方は、シグナルハンドラを使う方法です。これはシグ > ナルボックスにシグナルが溜まると所定の関数をすぐに呼び出す仕組み > で、シグナルボックスの中のシグナルが通常のものなのか緊急のものな > のかは判別しません。いうなれば、すべて緊急として扱っている、とい > えるでしょうか。 > > アプリはシグナルハンドラ内で通常シグナルのキューイングや緊急シ > グナルへの応対などをするわけです。このシグナルハンドラについて詳 > しく説明するとまた長くなるので、まずはcntupc3などをご覧ください > 。シグナルをポールすることなく、シグナルが検出できるというなによ > りの例です。必要でしたら、このシグナルハンドラについて詳しく説明 > いたします。 cntupc3 を見ました。シグナルハンドラについては、これで分かりました。 確認ですが、 (1)シグナルハンドラで 1度だけ getsignal() して処理を行っている間に、 シグナルが発生した場合はシグナルボックスにためられ、シグナルハンドラ からリターンした場合にすぐにシグナルハンドラが呼ばれる (2)ぐいぐい01 で優先順位を設定した場合に、(1)でシグナルボックス にためられる時点で優先度の低いシグナルを落とすような処理が 行われる。 ということで合っているでしょうか。 ただ [OSASK 4121] によると、 >現時点でシグナルハンドラを利用したCプログラムで公開されているのは、pac >k004sのcntupc3ですが、これはタイマーの使い方が正しくありません。 とのことですが、どこが正しくないのか私には分かりませんでした。 #ところで、cntupc3 がどこにあるのかは OSASK-ML の過去メールに対して #"cntupc3" のキーワードをかけて検索して pack04s にあることが分かり #ましたが、今までに川合さんが出したサンプルは相当な数があるので、 #目録があるといいかもしれませんね。作るのは大変ですが。 > ということで、ぐいぐい00ではシグナルをポーリングするやり方と、 > シグナルハンドラを利用するやり方の両方を既にサポートしているわけ > です。それでプログラマは自分の書くプログラムの性質に合わせて、ど > ちらかのスタイルを選べばいいわけです(併用もできます)。 割り込みが必要な場合はシグナルハンドラを定義して、 ・緊急シグナルはその場で処理 ・その他のシグナルはキューにためてリターン ・メインループでキューからシグナルを取り出して処理 というのが私には分かりやすそうです。 > >UNIX のように、シグナルでプロセスの終了(SIGTERM)、中断(SIGSTOP)、 > >再開(SIGSTOP)といった動作をさせる、あるいは、それらのシグナルをハンドル > >することは、OSASKではどのような実装になるのでしょうか? > > ということで、どんな実装でもいいわけです。速やかに反応できるか > どうかの違いはありますが。反応が悪くて困るなら、シェルからkillす > るとか、強制スリープをかけるとか(全てのローカルレベルをスリープ > に設定してしまう)、まあいろいろ手段はあるわけですし。・・・もち > ろん迅速に反応してくれればそれにこしたことはありません。 chuck1 で kill コマンドがサポートされたのですが、そこで送っている KILL シグナルは、シグナルボックスの枠組とは別なのでしょうか? そもそも私にはシェルから kill したり、ウインドウのクローズボタンを 押した時にタスクに何が起こって終了するのかの内部構造が分かって いないのでその情報へのポインタか解説をしていただけるとうれしいです。 -- 小柳 雅明(http://homepage1.nifty.com/dreaming/) 「人の足を止めるのは"絶望"ではなく"諦観" 人の足を進めるのは"希望"ではなく"意志"」 -- ARMS