しかし、この方法にも間題がないわけではありませ ん。クライアントが 1 つでもサービスを要求してサーバ ーが起動されてしまうと、クライアントの終了か確認で きないため、サーバーを終了することができません。た とえは、クライアント側で終了時に大きさ 0 の書込みを おこなうなどしてサーバーに終了を伝えることはできま すが、すべてのクライアントにそれを求めることはでき ません。だいいち、情報がなくなるおそれのある UDP では、大きさが 0 であっても安全確実に書き込まれると はかぎりません。たとえクライアントの終了を知ること ができても、複数のクライアントが 1 つのサーバーに接 続している可能性もあります。 1 つのクライアントの終 了によってサーバー・プログラムを終了することが、正 しいのかどうかも判断に悩むところです。 こでは、 select システムコールを使って、一定時間 クライアントからの通信がなければサーバーを終了する プログラムを作成してみました ( リスト 6 ) 。 プログラムの本体は for の無限ループになっていて、 select でタイムアウトか起きるとプログラムを終了しま す。こうしておけは、いくつもの要求か読けて送られて きても、サーバー・プログラムをむだに起動することな く、 1 つのサーバーで処理できます。さらに、クライア ントからの要求がない場合は、システムのリソースを解 放するためにサーバーを終了させることができます。 UDP の nowait 型のサーバー inetd では、 wait 型のはかに nowait 型のサーノヾー も扱えます。しかし、 nowait 型のサーバーを指定する と、サーバーを起動した直後に再度ソケットの状態を検 査してしまいます。これは、かなり厄介な問題です。サ ーバーか起動されてから実際にソケットの内容を読み込 むまでには、ある程度の時間がかかります。しかし、 のあいだにも inetd はソケットの状態を調べて別のサー ーを起動してしまいます ( ちょっと実験してみたとこ ろ、クライアントから数文字ぶんの情報を送っただけで 約 20 のサーバーか起動されてしまいました・ ここで nowait 型のサーバーの作り方を はんとうは、 説明しようと考えていたのですが、なかなか思いどおり にはいきません。そこで、前回紹介した、 wait 型のサー バーで nowait 型のような処理をおこなうサー ライアントを作成してみました。 UNIX MAGAZINE 1996.7 ーとク IJN Ⅸ流プログラミング 69 サーバーのコードはリスト 7 のようになります。 ます、 recvfrom を使ってクライアントのアドレスを 取得したあと、新たにソケットを作成します。そして、 このソケットの相手を connect システムコールでクラ イアントのアドレスに固定します。ここでこのソケット に対して通信をおこない、この新しいソケットのアドレ スをクライアントに通知するわけです。そして、クライ アントがこのソケットに対して通信をおこなうようにし ます。これで以前のソケットは不要になるので、 fork を おこなってもともとのプロセスを終了させます。 inetd は、自分自身が起動したプロセスを監視しているため、 fork した親プロセスを終了させることにより、同しソ ケットに対する別のクライアントからの要求の処理を実 行させることができるのです。一方、子プロセスのはう は、相手先をクライアントに固定したソケットを新たに 作成し、これを使ってクライアントと情報をやりとりし ています。 この処理はやや複雑なので、クライアントの作成方 法もこれまでのものとは異なります。つまり、サーバ ーとクライアントの両方を工夫することで、擬似的な nowait 型のサーバーを実現しているのです。 クライアント・プログラムは、リスト 8 のようになり ます。サーバー側のアドレスを設定し、最初に sendto で情報を送ったあと、返答として返される recvfrom に 格納されたアドレスを用いて connect システムコール を実行しています。 recvfrom で返されるのは、サーバ ー側で新たに作成したソケットのアドレスですから、 れ以降は新たなアドレスでの通信がおこなわれます。 ここて示したのは、たんなる例にすぎません。くどい ようですが、 UDP を利用する場合には情報がなくなる ことも計算したうえでプログラムを作成する必要があり こで作成したプログラムはあま ます。その意味では、 りよいお手本とはいえないかもしれません。これらの処 理はかなり複雑なので、どうしてもという事情がなけれ ば、 TCP を用いたほうが賢明です。 UDP でなければできないこと UDP について否定的なことを書いたはかりですが、 UDP でなけれはできないことももちろんあります。そ の代表格が、プロードキャストを用いた通信です。 プロードキャストを使ったソケットの利用例として、 149
連載 /lnside DVI → PS—@ リスト 1 VFlib 関連の Makefile 彦正 a) VFlib を使用する場合 # optional font formats FONTF = —DVFLIB # VF1ib library (comment out next line if VFLIB = /usr/10ca1/1ib/VF1ib . a b) VFIib を使わない場合 # optional font formats #FONTF -DVFLI B # VF1ib library (comment out next line if #VFLIB = VF1ib. a —DVFLIB is not included) —DVFLIB is not included) リンタにはメモリがあまり載っていませんでした。そこ で、印字可能領域を狭くして印刷イメージ刎尉寺に必喫 なメモリ量を減らし、処理に使えるメモリ量を実質的に 増やしていました。しかし、現在ではイなオプション なので、特別な事情のないかぎり、、 True " 窈旨定のまま にしておきます。 7. プリンタ解像度を RESOLUTION に指定します。単位は RESOLUTION=300 # resolution Of the printer (dpi) DPI(Dot Per lnch) です。 UNIX MAGAZINE 1996.7 ていないかを石忍しましよう。 しるしく位置がすれるような場合は、用紙設定力澗違っ 通常は、これも変更の必喫はありません。ただし、いち LEFTMARGI N = 72 TOPMARGIN=72 # top margin and left margin (unit 1 / 72 inch) 1 / 72 インチです ( 72 で 1 インチ ) 。 8. ページの左上部のオフセット量を指定します。単位は さい。 リンタのカタログや説明書を読んで正しく設定してくだ 設定を間違えるときれいな印刷結果カ碍られません。プ に想定している解像度に関係します。したがって、この ウトライン・フォントがビットマッフ。展開されるとき トが前提としているプリンタ解像度や、 VFlib 2 でア ここで指定する値は、使用するピットマップ・フォン 使わない場合には設定する必要はありません。しかし、 これは、すべてのフォントについて PS フォントしか ら、たいていは変更することになるでしよう。 い 600dpi のプリンタがお充になってきました。ですか デフォルト値は 300dpi ですが、去も匠はより解像度の高 以前のバージョンでは、前述のとおり一部の用紙サイズ か設っていたので、印刷結果に狂いが生していました。 そのため、この値を操作して髜各することもありました が、このバージョンでは修正されています。 9. VFIib 2 のライプラリをリンクするための設定をしま されているかもしれません ) 。 がありました ( 本読劼ゞ店頭に並ぶころには、正式に修正 で、ヘッダファイル defs. h にすこし修正を加える必要 2 にインストールしましたが、次のように変更したうえ 11. C コンパイラのオプションを指定します。私は SoIaris CC=c c きには変更します。 は、、 cc " ですが gcc など、ほかのコンパイラを使うと 10. 使用する C コンパイラを設定します。デフォルト 挿入してコメントアウトします ( リスト l-b) 。 VFIib を使わない場合は、どちらの行も行頭に、、 # " を 張ってもかまいません。 ディレクトリに VFlib. a へのシンポリック・リンクを イ寸属の install. doc に書かれているように、 dvi2ps の 1 ー a のように修正します。 ディレクトリの下にインストールされるので、リスト す。 VFlib のデフォルトの設定では、 /usr/local/lib VFlib を使う場合は、 VFLIB に VFlib. a を指定しま す。 CCFLAGS ー 0 —DSYSV —DSYSVIO # S01aris 2 . X ここてオ日疋している SYSVIO は、このノヾージョンから 導入された System V の fseek() を高速化するための オプションです。 127
連載 /lnside DVI → PS ーの 新規ライフラリの作成 配布パッケージを展開したら、最初に 1 回だけ次のよ うに実行します % make newlib は、「 lib-dist にある fontdesc の説明」を参考にしてく すそのままでもいいでしよう。詳しい設定方法について ん使う機能だけを設定して重川乍を石忍し、あとはとりあえ を完璧に設定しようとするとつまづきかねないので、ふだ の fontdesc の設定の複雑さが . 魁です。最初からすべて dvi2ps-j はたいへん優れた機能を備えていますが、 いては、次回に説明する予定です ) 。 蔵フォントを使用する例を示しますにれ以外の設定につ 今回は、もっとも一ヨ勺なケースと思われるプリンタ内 トリに作成します。普通は fontdesc です。 DESC で指定したファイル名のファイルを lib ディレク デフォルトの fontdesc として、 Makefile の FONT- テフォルトの fontdesc ファイルの作成 ファイルを修正します。 環境に合わせて変更するときは lib ディレクトリにある ァイルには手を加えすに配布時のまま残しておき、自分の こ窈巣作をしたあとは、 lib-dist ディレクトリにあるフ で lib ディレクトリにコピーされます。 の lib-dist ディレクトリに含まれていますが、この操作 dvi2ps-j では、各種の成疋ファイルは配布パッケージ ださい [ 5 ] 128 fontdesc printer/LWII # printer spec LaserWriterII NTX-J # dvi2ps font description file fo て このファイルは、次のような疋になっています。 % cp LWIINTX—J fontdesc ピーします。 これらのうちのいすれかを、 fontdesc という名則でコ ・ Sun SPARCprinter 用 (SPARCptr) ・リコー SPIO 用 (RicohSP10) ・ LaserWriter NTX-J 用 (LWIINTX-J) 1. lib の下には、次の 3 つのプリンタの設定例があります。 # font selection fontdesc bikanji fontdesc fonts/generate fontdesc から始まる行は、はかの fontdesc ファイル を取り込むことを未しますので、そこで指定されてい る各 fontdesc ファイルについても石薩勘ゞ必要です。 2. プリンタの設定を書き換えます。 ーヒの例では、プリンタ固有の成疋が printer/LWII と いう fontdesc ファイルに次のように定義されていま す。自分の使っているプリンタの設定がない場合は、新 しいファイルにコピーしてから内容を書き換えます。 # LaserWriterII resolution 300 def ine mode CX define bk mo て 2 1 行目が解像度の指定、 2 行目が METAFONT でフォ ントを作成する際に指定するモード窈旨定 ( フォントを 自動生成するときに必要です ) 、 3 行目かプリンタ内蔵 フォントの修正のために使うバーチャル・フォントが 置かれているディレクトリ名 ( アスキー日本語 ' IVyX 、 p1VJX を使用する際に必要です ) の指定です。 UNIX MAGAZINE 1996.7 に、目的に応したサプディレクトリに分割されている 各変数は、それぞれ次のような意味をもちます。さら define If /usr/local/lib/tex/jfonts/wadalab vfontcap /usr/local/lib/vfontcap define psf /usr/local/lib/tex/psfonts define af /usr/local/lib/tex/j fonts define nsf /usr/local/lib/tex/j fonts define f /usr/local/lib/tex/fonts ように定義されています。 この疋は config という fontdesc ファイルで次の 4. 各種ディレクトリの設定を書き換えます。 fontdesc fonts/asc—bikanj i f ont de s c f ont s /ntt —b i kanJ i # kanj i font fontdesc fonts/efontdef # ascii font include dvi2. ps # header fontdesc config # configuration ています。 の設定例です。このファイルは、次のような設定になっ 3. bikanji というファイルは、プリンタ内蔵フォント用
ネットワークにどういうアドレスのマシンカ材妾続されて こでは、さきはど触れ いるのかを調べてみましよう。 た UDP の echo サーピスを利用します。つまり、プ ロードキャストを用いてすべてのマシンに echo サービ スのリクエストを送り、返答があったマシンの名前を出 力するのです。このプログラムは、リスト 9 のようにな ります。 このプログラムでは、プロードキャスト・アドレスを プログラムのなかに埋め込んでいますが、実際に使うと きは皆さんか利用しているネットワークのものに合わせ てください。このアドレスは、、、 netstat—i" コマンドで 調べたネットワーク・インターフェイスに対して ifc 。 nfig コマンドを実行すれは分かります。 このプログラムのちょっと変わった部分は、最初の ほうで setsockopt システムコールを実行している点で しよう。 setsockopt システムコーノレは、 setsockopt(fd, level, name, 0 〃 t , size) という形式で利用します。には、オプションを設定 するソケットを指定します。次のん眦 I には、ソケッ トのどの部分に対してオプションを設定するのかを記 号定数で指定します。 こでは、ソケットレベルに対 するオプションを指定するため、 SOL-SOCKET とい う値を指定します。次の name には、設定するオプシ ョンを示す記号定数を指定します。ここではプロードキ ャスト通信を可能にするための SO-BROADCAST と いう名前を指定しています。次の。には、オプショ ンの種類に応じて決められている型の値を指定します。 SO-BROADCAST の場合には int 型の値を指定する ことになっているので、 int 型の変数のアドレスを指定 します ( 値として指定するのは、、アドレス " です ) 。最後 リスト 1 UDP を用いて実現したサーパー・プログラム #include く stdio . h> #include く stdlib . > #include く string ・ > #include く sys/types. れ > #include く sys/socket . h> #include く netinet/in. h> #include く netdb . > #define SERVICE "umtest" main() int 150 fd; の size には、叩で指定した変数の大きさ ( この例の場 合は sizeof(int)) を指定します。この呼出しでは、 opt の内容が 0 以外の場合には、プロードキャスト通信が可 能なようにソケットが設定されます。 このプログラムでは利用していませんが、現在のオプ ションの値を取得する getsockopt システムコールも用 意されています。こちらの形式も、 getsockopt ()d , level , name , 0 t , size) ですが、最後の size だけは int 型の変数のアドレスと して指定します。このとき指定する変数には、あらかし め叩の大きさを格納しておく必要があります。また、 叩は値を受け取るための変数のアドレスで、そこに格 納されている値は関係ありません。はかの引数の利用方 法は、 setsock 叩 t とまったく同じです。この呼出しをお こなうと、叩 t に実際のオフションの値が設定されます。 setsockopt も getsockopt も、成功した場合は 0 が、 失敗した場合は一 1 か返されます。 ◆ 今回は、 UDP を用いたソケットの例として、簡単な クライアントとサーバー inetd 経由て起動するサーバ 、 wait 形式のサーバーで nowait 形式に似たサービス を提供する方法、ソケット・オプションを設定してプロー ドキャスト通信をおこなう方法などを紹介しました。 UDP を使った通信では、信頼性が保証されないため に、プログラムの作成にもいろいろな間題が生します。 しかし、プログラムの書き方を工夫すれば、 TCP と同 様な信頼性を UDP 上で提供することも可能です。 ( いまいすみ・たかし東京工業大学 ) UNIX MAGAZINE 1996.7
2 寺集 モーレッ UNIX 図 24 monkey 君 ( 左 ) とあつぶるちゃん佑 ) の絵 図 23 bitmap を実際の寸法で表示する ロ imagæ凹 描画領域の大きさを変えるには、 bitmap を起動してか 図 25 ファイル呆存ウインドウ ら File メニューの Resize という項目を選んて指定して もいいのですが、ウインドウ全体の大きさは変わらないた Save 「え le : め、領域を大きく取ると点カ田かくて分かりづらくなりま す。 -size オプションだと指定した描画領域の大きさに応 じてウインドウの大きさを変えてくれるので、ビットマッ プの大きさが分かっている場合は、 -size オプションで て描いた記念すべき絵なんやから、ちゃんと保存しとく 指定するほうが使いやすいでしよう。 んやで。 % bitmap —size 48X48 & 作成したヒ、ツトマップを保存するには、 File メニュー [ 1 ] 20901 の Save を選びます。図 25 のような入力面画が表示され るので、適当なファイル名を入力して OK ボタンをクリッ また、 bitmap の Edit メニューで lmage を選ぶと、 クします。 実際の寸法でビットマップを別のウインドウに表示しま bitmap を終了するには、 File メニューで Quit を選 す 29 。描画顴域だと拡大されすぎて感じがっかめないとき ぶか、あるいはキーポードから、、 q " あるいは、℃ー c " を入 に使うと便利です。ちなみに、さきほどの。 m を表示 力します。 させると、図 23 のようになります。 bitmap を使って作成したビットマップ・ファイルは、 前回紹介した xsetroot コマンドでルートウインドウに敷 monkey : こっちは完成したで。あつぶるちゃんはどな きつめたり、 twm のアイコンなどて利用できます。 fvwm し、や ? ではカラーの P ⅸ m 叩というフォーマットも利用できる あっぷる : こっちももうすこし・・・・・・できました ! ! ので、ビットマップは影が薄いかもしれませんが、瑕が monkey : はな、お被露目といこか ( 図 24 ) 。なんやの、 あったら使ってみてください。 それは ? 、、岩場のイソギンチャク " か ? 次回は、 twm より派手な ( ? ) fvwm と、 UNIX とユー あつぶる : 違いますよ。、、河原に降りてきた UFO " です ! ザーの接点であるシェルについて紹介する予定です。 そういう monkey 先生のはなんなんですか ? だいた ( おかやま・きよひこ、かたやま・よしあき い、字を書くなんてインチキ ! ! 奈良先立斗オ支術大完大学 ) ーは関西や、うけたはうカちゃ ! ! monkey : ゅうても、あつぶるちゃんは関東出身やから分からん か。どうやら、この勝負は引分けやな。 UNIX で初め 29 上ドに 2 枚表示さードは白黒反転させたイメージとなります。 39 UNIX MAGAZINE 1996.7
2 特集モーレッ UNIX 教室 こて色を指定しているとか、メニューの設疋をしている という程度は分かるはすです。 ューサー独自の設定をおこなうには、各自のホームディ ・不一ジャー twm の設定を大まかに分類すると以下のようになりま す。 は、 /home/apple/. twmrc" で置き換えることができま リが /home/apple だとすると、上記の、、 ~/. twmrc 味します。あつぶるちゃんの場合、ホームディレクト こで使われている はホームディレクトリを意 % cp /usr/X11/1ib/X11/twm/system. twmrc ~/. twmrc 定します。 する場合は cp コマンドを使い、コピー元とコピー先を指 こしすっ変更を加えるといいでしよう。ファイルをコピー の人力硬っているものをコピーし、乍を石忍しながらす るのは大変ですから、ますシステムの設疋ファイルやほか ファイルの書き方が分かっても、最初からすべてを作成す レクトリ 14 に . twmrc というファイルを作ります。設定 す。 を指定できます。 ・フォント ・色 ンヤーの大きさや形のはか、アイコ タイトルバーやメニューなどて表小する文字のフォント タイトノレヾーやメニューなどでイ吏う色を指定できます。 ・アイコン アイコン ン・マ不一 ・メニュー ンヤーで表示しないウインドウを指定でき メニューのラベル喇尺日 ) 衄乍を指定します。 ・タイトノレヾー タイトルバーを短くしたり、タイトルボタンに使尹兼 ( ピットマップ・パターン ) を指定します。タイトルポ タンにメニューを割り当てることもできます。 ・マウスポタンと重川乍の割当て クリックする場所とマウスポタンおよびキーの組合せ で、どのような重加乍をおこなうかを指定します。 14 ューサーがログインしたときのディレクトリです。 UNIX MAGAZINE 1996.7 多くの設定は、決められた変数に値を指定しておこな います。たとえば、タイトルバーの背景色を表す変数は Tit1eBackground で、青くしたい場合は、 Tit1eBackground "blue " のように言己します。変数によって値の不鶤頁は異なり、文 字列や直、リストなどの値があります。すべての変数を 糸蛩忙すると大変なので、さきほどの分類に従っておもなも ・アイコンやウインドウの枠 ・マウスカーソル アイコン・マネージャー ・アイコン メニュー タイトルバー twm では、以下の部分の色を変更することかできます。 色の設定 のを紹介します。 変え、あとは基本色を使う場合は以下のようになります。 述します。たとえは、タイトルバーとメニューの色だけを 指定する部分と色を決めたら、 C010r 変数にまとめて記 を統一したい場合に使う凵叫リです。 の基本色に従うので、ある部分だけをほかの色にし、残り 指定できます。設定ファイルで指定しなかった部分はこ Defau1tForeground および Defau1tBackground で れらに加え、基本となる描画色と背景色を、それぞれ 色指定で使われるおもな変数を表 2 にまとめます。 Tit1eBackground 'tgreen" Tit1eForeground "yellow" れは、以下のように言当します 15 えは、タイトノレヾーの描画色を黄色、背景色を緑にしたけ 景色 (background color) を別々に指定できます。たと 枠の色ユ外は、すべて描画色 (foreground color) と背 15 色の名前は二重引用符 ( " ) て悃みます。 Tit1eForeground MenuBackground MenuForeground C010r 25 "light Ye110 " "dark green' "cornsilk"
牛寺集 図 17 タイトノレく一のボタンを変更 ・ menu 図 14 て使われていた本期兼です。 ・ question 言わすと知れた ( ? ) 、、、 ? " マークです。 これらのパターンを指定する場合は、、、ビットマップ 名 " の部分には上記の名前の地寬こコロン ( : ) を付けたも のを指定し、外部のファイルと区別します。 一方、 /usr/X11/inc1ude/X11/bitmaps ディレクト リに置かれているようなビットマップ・ファイルを利用す る場合、、、ビットマッフ。名 " にはファイル名を指定し、さ らに IconDirectory 変数を使ってファイルが置かれて いるディレクトリを指定する必要があります。 この機能を使って、以下のようにタイトルボタンを変更 してみましよう。 IconDirectory " /usr/X11/inc1ude/X11/bitmaps" NoDefau1ts LeftTit1eButton "menu12" f . menu "OPS" RightTit1eButton RightTitIeButton "C10se" Menu "ops " :reslze f . fullzoom f . resize . ralse f . lower f . delete f この設疋で twm を起動すると、タイトルバーは図 17 のようになります。左のタイトルボタンをクリックすると ops という名前で定義したメニューがポップアップし、 番右側にあるタイトルボタンは f. て esize 、右から 2 番目 のタイトルボタンは f . fullz 。。 m に対応します。 twm に 組み込まれているビットマップは実際に使ってみないとど んな模様か分かりませんが、外部のビットマップ・ファイ ルについては、彳あする bitmap コマンドを使うと簡単 に模様を石忍できます。 さらに、タイトルバーに関しては、幅を変えたり特定 のウインドウに対してタイトルバーを表示しないように することができます。タイトルバーの幅を変更するには、 SqueezeTit1e 変数を用います。値を指定しなければ、 すべてのウインドウのタイトノレヾーか 1 司じように短くなり ます。たとえは、さきほどタイトノレヾーのボタンを変更し 2 モーレッ UNIX 図 18 短くなったタイトルバー コ xtenn 園 た成疋に SqueezeTit1e を加えると、タイトルバーは図 18 のようになります。 また、 NoTit1e 変数を使うと、タイトルノヾーを付け ないウインドウを指定できます。値には 1conManager DontShow と同様に、ウインドウのリストを与えます。 マウスポタンの設定 マウスポタンの設疋をおこなうと、マウスをクリックし たときの蛎乍を変更できます。基本的な書き方は、以下の ようになっています。 ボタン = キー : 場所 : 関数名 最初の、、ボタン " にはマウスポタンを指定し、左から順 に Button1 、 Button2 、 Button3 に対応します。、、キ " にはマウスポタンと同時に押すキーを指定します。 Shift キーは s 、 Control キーは c 、 CapsLock キーは 1 、 メタキーは m に対応し、複数のキーを同時に指定する 24 場 合は、、にで区切ります。、、キー " を省略すると、マウスポ タンだけをクリックしたときの重川乍を設定することになり ます。 、、場所 " には、、、ボタン " で指定したマウスポタンをクリ ックしたとき、マウスカーソルがあるべき場所を指定しま す。使える名前と場所の対応は、以下のようになってい ます。 frame ICOII 1 C onmgr root 24 つまり、 ウインドウの枠 アイコン アイコン・マネージャー ルートウインドウ 複数のキー学に押しながら、 、ボタン " 定したマウス 32 ボタンをクリックすることを意味します。 UNIX MAGAZINE 1996.7
2 特集モーレッ UNIX に表示できるようになります。さすがに、 Windows や Macintosh のように終了時の状態を保存できるわけでは ありませんが、ログインする段階で必要なツールが自重加勺 に配置できるだけでも、かなり手間が省けます。 あつぶる : でも、 twm の疋みたいに、かなり複雑なん しゃないですか ? monkey : ちょっと twm の印象か強烈やったか。こし つに関しては大丈夫や。あつぶるちゃんは、いままで コマンド行からツールを起けるのに xterm & だ の、、 t Ⅷ & " だの入力してたやろ。ぶっちやけた話、そ れをそのままファイルに書くだけやねん。 あっぷる : あー、それなら簡単そうですそんなにたく さんツールを起動してるわけしゃないから、 3 ~ 4 行で 終っちゃうんじゃないですか ? monkey: ただし、あつぶるちゃんには X クライアント のコマンド行オプションをぜんぜん教えとらんからな。 オプションを使えば、ウインドウの大きさとか位置と か、あと色なんかも指定できるんや。ますはそこから始 めよか。 コマンド行オプション 多くの X のツールはコマンド行から実行する際、オフ ションとしてツールの動作や見栄えなどを指定することが できます。もちろん、ツールごとに独自のオプションを もっているのですが、ウインドウのジオメトリ情報や色 テキスト表示に使うフォントなど、多くのツールに共通す るオプションがあります。 これらのオプションを X 起重加芋の設疋ファイルに指定 しておくことにより、いつも決まった位置にウインドウを 並べることができます。共通するおもなオプションには、 以下のようなものがあります。 ・ -geometry ル x + X + Y ウインドウのジオメトリ情報 ( 大きさと表示位置 ) を指定するオプションです。 twm の IconManager Geometry 変数で説明したように、ウインドウの幅と 高さ、 X 座標および Y 座標を与えます。幅と高さにつ いては、はとんどのクライアントがドット数で与えるの に対し、 xterm などでは横と縦の文字数で与えます。 ・—bg color UNIX MAGAZINE 1996.7 ウインドウの背景色を指定します。色の名前が 2 つ以 上の単語からなる場合は単一引用符 ( って悃みます。 ・—fg color ウインドウ苗画色を指定します。 ・—bd co ん 7 ・ ウインドウの枠の色を指定します。 ・一て V 描画色と背景色を反転させます。 ・—fn ルれ テキスト表示に用いるフォントを指定します。 ・一 1 C on 1 C アイコンの状態て起動します。 ほかにも共通のオプションはいくつかありますが、ウ インドウの見栄えに関する部分はこれくらいで - 、分でしょ う。ツールに特有のオフションについては、おいおい紹介 していきます。 ウインドウのイ立置を調べる ウインドウの色やフォントを調べるガ去は、前節て紹介 しました。数多い色やフォントから好みのものを選ぶのは 大変ですが、 xco や xfd などのツールを使うと、実際に目 で見て確かめることかできます。 では、ウインドウの位置はどうやって調べるのでしよう か ? ジオメトリ情報を当てずつほ。うで指定し、ツールの 起動を繰り返して誤差を修正・・ こんなことをやって いたら、いつまでたっても終りそうにありません。 X のツールには、ウインドウに関する情報を謌べるため のコマンド xwininfo があります。これを使うと、扣疋 したウインドウに関するさまざま囹青報を表示します。 のなかにはジオメトリ情報も含まれるため、参考にしなが ら位置決めをおこなうのが手つ取り早そうです。 xwininfo を引数なしで実行すると、以下のようなメッ セージか表示さマウスカーソルの形が + に変わりま す。 xwininfo : P1ease select the window about which y % xwininfo 35 mouse in that window . would like information by clicking the
2 寺集モーレッ UNIX の配置によっては逆に使いづらいかもしれません。 これらの定は、すべて設定ファイルを通じて変更でき おきます。 ・ IconManagerDontShow 、 IconManagerShow 値として、ウインドウ名のリストを指定します 22 。前者 を設定すると指定した名前のウインドウをアイコン・マ ネージャーに表示しなくなり、後者は指定したものだけ を表示します。たとえば、 oclock や xclock などはア イコン・マネージャーて管理する必要がないと思えば、 以下のように言当します。 I c onManagerDont Sh0W "xclock" " oclock ” これらの変数をうまく利用す川ま、ウインドウか増えて もアイコン・マネージャーがごちやごちゃしません。 ・ IconManagerGeometry アイコン・マネージャーの大きさと位置、さらに、 1 行 に表示するアイコンの最大数を指定します。大きさと位 置ク片旨定は以下のような書き方に従います。 幅 x 高さ + X 座標 + Y 座標 幅や高さはドット数で指定し、 X 座標と Y 座標は原 点からのドット数で表します。 X の座標系は、左止隅 が ( 0 , 0 ) です。 + の代わりに を指定すると、反 対イ則が原点となります。したがって、、、 100X200 + 0 ー 0 ' だと、幅 100 ドット x 高さ 200 ドットのウインドウが、 画面の左ード隅に表示されることになります。位置と大き さの情報はジオメトリ (geometry) と呼は X での 共通した指定方法なので、憶えておいてください。 ジオメトリ情報に加え、オフションとして 1 行に表示 するアイコンの最大数を指定することもできます。たと えは、 IconManagerGeometry を以下のように設定し たとしましよう 23 IconManagerGeometry " 200X200 ー 0 ー 0 " 2 22 ウインドウ名 ( お : 重引用符で括り、リスト本を吋刮瓜て棚みます。 23 ジオメト月帯長は二重引用符で囲みます。 28 図 12 アイコン・マネージャーのカスタマイズ 0 Xte れれ oclock xterm xterm こまでの設定は、おもに twm の見栄えに関するもの でしたが、これから紹介するメニューやタイトルバーなど は、使いやすさに直接景ルます。 twrn では、ウインドウの移重丿大きさの変史などの基 本的な機能は、関数として提供されています。たとえば、 ウインドウのアイコン化をおこなう関数には f. iconify という名前カ咐いており、メニューの項目などと対応させ ることによって重川を指定します。さらに、いくつかの関 数を組み合わせて新たな関数を作ったり、外部のコマンド を呼び出す関数を用いて、マウスの操作によってさまざま なツールを起重丿けることができます。 設定の後半戦に突入する前に、 twm で提供されている 関数について触れておきます。 ほとんどの関数には、、 f . " て始まる名前が付いており、 おもなものを挙げると表 4 のようになります。 すると、アイコン・マネージャーは図 12 のようになり ます。この際、アイコン・マネージャーに表示される 1 つのアイコンの幅は、アイコン・マネージャーの幅を横 に並べるアイコンの最大数て割ったドット数にの場合 は 100 ドット ) になります。したがって、ウインドウ が 1 つの場合、アイコン・マネージャーの幅は半分の 100 ドットで、ウインドウが 2 つに増えると幅カイ音に なります。さらにアイコンか増えるとアイコン・マネー ジャーが -- ドに伸び、図 12 のような状態になります。 ・ ShowIconManager 値はなく、この変数を設定ファイルに書いておくと、 twm の起動時にアイコン・マネージャーが表示され ます。 ・ SortIconManager アイコンのリストを、アルファベット順に並べ替えて 表示します。 ShowIconManager と同様、値はとりま せん。 twm の関数 UNIX MAGAZINE 1996.7
ログラムを作成すべきでしよう。 汎用クライアント・プログラムの作成 こで、 UDP を用いてデーモン・プログラムの動作 を確認するために、汎用のクライアント・プログラムを 作成します ( リスト 3 ) 。これは、リスト 2 のクライア ント・プログラムに手を加えたものです。ポート番号の 指定ができるようにし、さらに標準入力とソケットのど ちらかから入力があったときにすぐ処理できるように、 select を用いて入力があるかどうかを調べています。 れは、サーバーとの通信がうまくいかなかった場合も、 、、それなり " に処理を続けるための工夫です。サーバー に 1 回書き込むと、サーバーから 2 回読み込まなけれは ならないようなときにうまく動作させるためにはこのよ うな工夫が必要です。コンパイル済みのこのプログラム たとえば uelnet という名前を付けた場合、 % uelnet localhost umtest とすれは、リスト 1 のサーバー・プログラムに接続でき ます。 これまでに作成したクライアント・プログラムとは違 って、標準入力からの読込みにも read システムコール を用いています。これは、バイナリファイルなどを入力 とする場合にも対応するためです。 このプログラムでは、リスト 2 のプログラムとは異な り、 bind システムコーノレと connect システムコーノレを 実行しています。さきほど「 ( UDP を利用すると ) bind を実行する手間が省ける」と書きましたが、 b ⅲ d システ ムコールが実行できないわけではありません。ポート番 号については、システムが自動的に決めるのではなく、 引数として指定した sockaddrän 構造体にオタされたも のか割り当てられます。ただし、今回の例のようにポー ト番号に 0 を指定しておくと、システムが自重加勺にポー ト番号を割り当てます。それなら、わざわざ bind シス テムコールを実行しなくてもいいのではないかと思うか もしれませんが、自分自身のポート番号カ鴃まっていな いと次の connect システムコーノレか夫行できないので、 bind が必要になるのです。 connect システムコールは、引数に指定したソケ ットの通信相手を限定するための呼出しです。通常、 DGRAM 型のソケットを使う場合は、 sendto を用い て相手を指定したうえで通信します。 connect システム UNIX MAGAZINE 1996.7 IJN Ⅸ流プログラミング 69 コールで通イ詁目手を決めておけば、通信するたびに相手 を指定する必要がなくなり、おなしみの read や write などの関数か利用できます。このプログラムでは使って いませんが、 read や write が利用できるのなら標準入 出力を用いた通信が可能になります。信頼が保証され ていないため、通信した内容の一部が消えるおそれがあ り、各種のプログラムをそのまま応用するのは難しいか もしれません。しかし、 LAN 環境において、手作業で 入力する程度ならはとんど情報の欠落は生しません ( も ちろん、標準入力からのリダイレクトなどによって大量 の情報を送ると、情報は欠落してしまいます ) 。この機 能をうまく使えば、 UDP を用いた通信でも簡単なサー ビスが実現できるのではないでしようか。 リスト 3 のフログラムでは、とくに指定しないかぎ り、デフォルトで echo というサービスを利用します。 これは、これまて題として用いてきたものと同様、サ ーに送った文字列をそのまま返すサービスです。 の種のサーヒ、スは、多くのシステムで TCP と UDP の どちらについてもデフォルトで準備されています。 「それしや、これまでいったいなんのためにサー プログラムを作ってきたの ? 」 と思うかもしれません。いささか言い訳めきますが、 こでとりあげている例題は、サーバー・プログラムの 作成が目的ではなく、その動作を知るためのものです。 echo サーバーが実現できれは、返答をそのまま差し戻 すのではなく、なんらかの計算をおこなった結果を返す ことも簡単にできるでしよう。 inetd を利用するサーパー 前回紹介した inetd では、 TCP だけでなく UDP の サービスも指定できますから、ここで inetd を利用する UDP のサーバーを作ってみましよう。 TCP の場合と異なり、 UDP では一般に wait 型の サーバーを構築します。 wait 型のサーバーでは、サー バーカ鮗了するまで次の要求を処理できないため、通常 は処理時間の短い ( しかも、入力によって返答のサイズ が変わらない ) ものが作成されます。ここで作成するサ ーも、できるだけ早く次の処理を実行できるように 単純なものにしてみましよう。 ます、前回の最後に作成したような情報を出力するサ ーを作成してみます。このサーバーも TCP のもの 147