指定 - みる会図書館


検索対象: UNIX MAGAZINE 1996年7月号
95件見つかりました。

1. UNIX MAGAZINE 1996年7月号

しかし、この方法にも間題がないわけではありませ ん。クライアントが 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

2. UNIX MAGAZINE 1996年7月号

連載 /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

3. UNIX MAGAZINE 1996年7月号

連載 /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 というファイルは、プリンタ内蔵フォント用

4. UNIX MAGAZINE 1996年7月号

ネットワークにどういうアドレスのマシンカ材妾続されて こでは、さきはど触れ いるのかを調べてみましよう。 た 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

5. 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

6. 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"

7. UNIX MAGAZINE 1996年7月号

牛寺集 図 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

8. 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

9. UNIX MAGAZINE 1996年7月号

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

10. 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