2006/02/09

「主筆」での標準入出力の扱い

基本的に「主筆」では、エラーメッセージはX上のメッセージボックスとして表示するようにしている。ところがそうも行かない場合もある。起動直後や子プロセス生成の前後、所定のタイミングで実行するコマンド内などでは、メッセージボックスの表示は困難である。そういった場合は、断末魔の叫びとして標準エラー出力にエラーメッセージを出力している。

ところがだ、最近それがうまくいかなくなる危険性が生じてきた。どういうことかというと、それは「主筆」がサーバプロセスから起動された場合だ。

サーバプロセスは必要に応じてクライアントから起動される。そのときサーバプロセスの標準入出力はクライアントのものと同じ所(端末エミュレータ)に結び付けられている。そして、そのサーバプロセスから起動された主筆もまた、標準入出力はクライアントと同じ端末エミュレータに結び付けられている。

ところが、今度は別の端末エミュレータからクライアントが起動されたとしたらどうだろうか。クライアントは既存のサーバにdoorを通じて指示を送る。サーバは主筆を起動する。そうすると、そこで起動された主筆の標準入出力は一体どこに繋がっているのだろうか。

答えは、サーバを起動したクライアントが使用していた端末エミュレータである。そう、主筆を起動するきっかけを作ったクライアント(二回目に使用された奴)が使用していた端末エミュレータは使用されないのだ。

そうすると、ユーザはかなり奇妙な感覚を抱くことになる。「主筆を起動するコマンドを入力したウインドウ」と「エラーメッセージが表示されるウインドウ」が異なるという現象が発生するのだ。それに、もしサーバを起動したときの端末エミュレータが閉じられてしまったとしたら、その後起動される全ての主筆は、標準入出力は一切使用することができなくなってしまうことになる。奇妙どころか、かなり困ったことになってしまう。

ではどうするか。

致し方がないから、クライアントが起動されたときの標準入出力を名前つきパイプとして度っかのファイルに結び付けておいて、主筆が起動されたら(あるいは主筆を起動する直前にサーバ内で)自分が持っている標準入出力を破棄、名前つきパイルを開いてそれを新しい標準入出力として使用することにした。そうすれば少しは一般のプログラムに近い感じになる。

だが、ここにも悩みがある。それは標準入力だ。現状考えている使用では、クライアントは主筆が起動、あるいは既存のものがアクティブにされたらそれで処理を終了するようになっている。だが、そうすると標準入力の扱いは一体どうしたらいいのだろうか。では今度は、クライアントは主筆が終了するまで待ち合わせるようにしたとしたらどうなるだろうか。クライアントからの要請で新しく主筆を起動したときは良いだろう。だが、そうではなく既存のものをアクティブにしただけの場合はどうなるのか。その場合はすぐに処理を終了するのか。

悩ましい問題だ。だが、まぁ、現状主筆では標準入力は使用しないのだから、この際完全に標準入力はサポート対象外としてしまうのも良いかもしれない。そうすれば比較的事態は単純になる。

で、難しいことは後で考えることにしよう。

0 件のコメント: