SC 翡 好評発売中 ! インターネットの 起源 ・ Katie Hafner 、 Matthew Lyon 著 ・加地永都子、道田豪訳 ・ A5 判、 336 ページ ・ ISBN 4-7561-3479-3 ・本体 2 , 500 円 + 税 誤った“常識”を覆し、創設に携わった人びとの肉声を あますところなく伝える貴重な証言集 目次から 即断即決で 100 万ドル / 大聖堂を建てたのは誰か / 第 3 の 大学 / プログラムと格闘する日々 / トウルート宛必着 / ハッ キングと喧噪と / 電子メール / 手にしたロケット 参考文献、索引 Java プログラミング・ノート 国際化と 日本語処理 図 5 カーソルデータの定義と参照 open (cursoreps , pnmtops CUrSOr ・ eps print cursoreps くく EOF ; P 1 10 16 1100000000 1010000000 1001000000 1000100000 1000010000 1000001000 1000000100 1000000010 1000000001 1000001110 1001001000 1010100100 1100100100 0000010010 0000010010 0000001100 EOF $cursor '\epsfile{file ,height=10pt}' or ・ eps Where Wizards Stay up Late The 0 g ⅲ 5 of The lnternet print くく EOF ; 定義したフォントは $CUrSOr のようにして参照できます。 EOF CAFE BABE クトリに cursor ・ eps というビットマッフ画像力乍成され、 定義したフォントは \epsfile{file=cursor. eps ,height=10pt} のようにして参照てきます。 という形式の出力カ碍られます。 動的なデータの使用 文書を整形するときにプログラムを起動したり計算し たりすることができれは、動的に刻ヒするデータも扱え ます。 たとえば、下記のプログラムを実行すると日イ寸カ咄力さ れます。 require ' ctime . p1 ' ・ $date = &ctime(time) ; print " 今日の日付は $ { date } です。 \ Ⅱ " ・ また、以下の Perl プログラムは、 自分自身のサイズを 1 算して出力します。 ・風間一洋著 ・ A5 判、 312 ページ ・ ISBN 4-7561-3481-5 ・本体 3 , 000 円十税 Java による日本語処理、さらには国際化プログラミング に必須の知識を数多くのサンカいプログラムを示し ながら平易に解説する。真の意味での "Write Once, Run Anywhere" を目指すプログラマーに最適の 1 冊。 目次から Java はどんな言語か / 国際化と地域化 / Unicode / ロケー ル / 工ンコーディング / タイムゾーン / リソースパンドル / フォ ーマット出力と解析 / 文字列の比較 / テキストの境界解析 / インブットメソッド / 文字の表示 付録 : Unicode プロック / ロケール一覧 / 工ンコーティング名 一覧 / タイムゾーン D 一覧 / ユーロ通貨記号への対応 株式会社アスキー 一三ロ 〒 1 5 1 ー 8024 東京都渋谷区代々木 4 ー 33 ー 1 0 出版営業部 電話 (03) 5351 ー 8194 171 UNIX MAGAZINE 2001.1
0 図 3 plain2 によるテキストから形式への変換 (a) 入力するテキスト い ) んごは ーみかんに 十一 (b)plain2 の出力 \begin{center} \begin{tabular}{ lc lc は \hline りんご & 10 \ \ \hline みかん & 20 \ \ \hline \end{tabular}\\ \end{center} (c) 整形結果 手順か複雑になるときは Makefile を用意しなければなら ないこともあるでしよう。 しかし、これも PerI を利用すれは以下のようなプログ りんご 10 みかん 20 ラムとして実現できます。 sub p1ain2 { local($text) open (p1ain2 , p1ain2 —tex print p1ain2 $text ; c10se(p1ain2) ; ( cat p1ain2. texc print $t ; 図版の自動 &p1ain2 ( くく EOF ) ; ー十一一十 い ) んごは ーみかんに EOF —nopre > p1ain2 . tex グラデーションで塗り潰した攵研彡を文書の区切りなどに 使うときには、あらかしめ EPS (Encapsulated post- Script) 形式などのファイルを作成しておかなければなり ません。 この場合にも、図 4 の Perl プログラムで EPS の図形 を生成し、同時にで参照可能な形式のファイルを出 力することもできます。 170 図 4 グラデーション・ファイル生成プログラム } for fill closepath x2 y2 lineto xl y2 lineto xl yl moveto x2 yl lineto newpath /y2 10 def /x2 xl 0 . 1 add def /yl 0 def /xl i 10 div def i 1000 div setgray /i exch def 0 1 1000 { %%BoundingBox : 0 0 100 10 %!PS-Adobe-2.0 EPSF—2.0 print gradation くく EOF ; open (gradation, " > gradation. eps" ) ; UNIX MAGAZINE 2001.1 図 5 の PerI プログラムを実行すると、カレント・ディレ ットマップ・データを利用するほうが手間がかかりません。 た場合には、フォントをインストールするのではなく、ビ たとえばのような牛幇朱な記号を 1 回だけ使うといっ で生成するようにしておけば、いくらか簡単になります。 と労力の無駄になりかねません。これも、 perl フログラム 数回しか利用しないフォントをインストーノレするのは時 インストールしておく必要があります。しかし、せいぜい たいときは、あらかしめ ' I 用のフォントをシステムに また、に標準で用意されていないフォントを使い くと扱いか楽になるでしよう。 ットマップ・データであれは、テキストとして記述してお して扱うのはリ巨見実的かもしれません。しかし、小さなビ 般に写真などの画像データはサイズカ吠きく、テキストと データを EPS ファイルに変換したものを使用します。 にビットマップ・データを取り込む場合、通常は ビットマップ・テータの利用 生成された図版 (gradation ・ eps) ( 誌面の都合上、斤り返しています ) EOF width=\columnwidth} \epsfile{file=gradation. eps , print くく ) EOF ' ・ close(gradation) ; EOF
インターフェイスの街角 図 2 report. pl とで記主すると、 = 55 # report ・ pl sub title { sub author { $author sub place sub date sub text sub out { $title { $place { $date $text print くく EOF ; EOF \ \ end{document } \\end{description} \\item [ 報告 ] $text \\item[ 場所 ] $place \\item[ 日時 ] $date \\begin{description} \\maketitle \\begin{document} \\title{$title} \\author{$author} \\documentstyle{jarticle} これを実行して得られたテキストにより、以下の print "\\hline\n\\end{tabular}\n" ような表カ鮓成できます。 AIAI AIA2 AIA3 AIA4 AIFD AIFE 計算機能の利用 ◎ ◇ にも簡単な計算機能はありますが、使いやすいと UNIX MAGAZINE 2001 ユ \ [ \ s ー { i = 0 ド { 10 } i \ ] たとえは、 0 から 10 までの糸谺日を計算する式を、 のてイ叫リです。 ば、言 1 算が必要になった場合も、凾のにで引算できる はいえません。汎用的なプログラム言語にもとづいていれ 10 を = 0 のような数式の出力カ碍られます。 このプログラムを実行すると、以下の数式出力カ材昇られ EOF print くく EOF ; $sigma + = $i, $sigma = 0 ; $ Ⅱ = 10 ; 出力することができます。 のようなプログラムを作成すれは、計算結果を含む数式を るのは容易ではありません。そこで、 Perl と併用して以下 しかし、この計算そのものをで処理して解答を得 を = 0 10 外部プログラムの利用 ます。 3 日本電気の内邸召宏さんか物発したプログラムで、各地の anonymous ておく必もあります。複数のファイルを扱う場合など、 るためには、 pIain2 の出力結果をファイルとして保存し ません。当然のことながら、の文書でこれを利用す は、罫線で描いたテキストファイルを用意しなければなり plain2 を用いてこのような ' IbX 形式の表を作成するに 式のファイル ( 図 3-b) に変換してくれます。 plain2 は、図 3-a のようなプレーンテキストを形 トファイルに変換する pIain2 というツールがあります 3 ASCII 文字を用いて描いた図表を形式のテキス などにオ内しておく必要があります。 で生成されたテキストをあらかしめ ' I し形式のファイル ログラムを呼び出すことはできないので、外部プログラム まなツールがあります。しかし、通常のでは外部プ UNIX には、以外にも文乍成を麪爰するさまざ FTP サーバーから入手できます。 169
0 $file @stat $Size print "mytext . tex" stat($file) ; $stat [ 7 ] ; このファイルのサイズは $ { size } パイトです。 \ Ⅱ " ・ コマンド行引数の使用 rIVfX にはコマンド行オプションがないので、 同じ文書 に対して異なる処理を指示するのは簡単ではありません。 しかし、 PerI プログラムであれば、コマンド行で文書整 形オプションを指定することも可能です。たとえば、コマ ンド行オプションによってと HTML の出力を切り 替えたり、マクロ定義などをコマンドで指定したりするこ 各種のチェック とかできるでしよう。 能な形式で文書を作成しておけば、そのような外吉。ログ うです。しかし、最初からにも HTML にも変換可 は、 Iatex2html というプログラムがよく使われているよ rIbX 形式のファイルを HTML 形式に変換する場合に こともそれほど難しくありません。 テキストファイルから rIVJX と HTML の文書を生成する の形式のファイルにも簡単に対応できます。まったく同し を前提としていましたが、出力する部分を変更すればほか こまでに挙げた例はすべて形式のファイル出力 以外のテキストの することも可能です。 前にスペルチェックをおこなったり、文字列を置換したり ています。これに手を加えて、ファイルとして出力する直 分で最終的な形式のテキストを出力するようになっ さきほど例に挙げた図 2 の report. pl は、 out 関数の部 おわりに ラムを使わずにすみます。 172 た。 NEXTSTEP では C と PostScript を組み合わせて どを効率的に作成するさまざまな手法が考案されてきまし これまでにも、複数の言語を組み合わせてプログラムな み合わせたことになります。 言語としての perl と、文囓整形言語としてのを組 み合わせて目的を達成する " ヨ列です。今回の例は、汎用 以 - ヒに紹介した手法は、、、複数の言語の得意な部分を組 使っていましたし、 C と SQL のような組合をも珍しくあ りません。ューサー・インターフェイスの状崟移、並列 実行、画面表示などを簡単に言当するためのユーサー・イ ンターフェイス記述言語を使い、 C などのアプリケーショ ン言語と併用するガ去も提唱されています。異なるモデル にもとづく複数の言語を組み合わせると、いろいろな問題 が出てきます。しかし、それぞれの守ー危囲で - ト分実用的 なものであれば、この種の組合せか有効に機能することも 多いと思います。 汎用言語によるプログラムと文書を同一視するのは、な んとなく孑動があるかもしれません。また、今回紹介した Perl プログラムは、 Perl 、 rIFyX 、 PostScript などで言 された部分か混在しているため、 rIbX 形式のファイルよ り読みやすいとはいえません。 これらの手法を現実に使う場合には、 MakefiIe を利用 するのが一勺でしよう。たとえば、 pIain2 で生成した ファイルを別のファイルで使いたいのであれ ば、一己のような MakefiIe を用意しておくといいかもし れません。 document . tex : graph. tex graph ・ tex : graph ・ plain2 p1ain2 —tex —nopre graph. p1ain2 > graph ・ tex ただし、上の例では文書ファイル本体 (document ・ tex) 以外に挿入するファイル (graph. tex) や、実行を制御す るための MakefiIe も必要になり、結果としてファイルや ディレクトリ構成か複雑になってしまうという問題もあり ます。 今回紹介した手法は、現実にある程度有効な場合もある と思いますが、プログラムを文書の作成に利用する 1 つの 例として考えていただければさいわいです。 プログラム本体も角党文書もマニュアルも 1 つのプログ ラムから生成できれば、 1999 年 12 月号で紹介した WEB システムを超える世界が開けてくるかもしれません。 ( ますい・としゆきソニー CSL) UNIX MAGAZINE 2001.1
0 生成など、アプリケーションごとに異なる言語を憶える 必喫があります。 刻長言言韶用髞はとかく巨大化しやすい ある程度以上のことを実現しようとす川ま、孑劇長言語と いえども一引麺勺なプログラミング言語と同様な機能を備 えているべきでしよう。条件皮や区しなどの制御文 は当然として、算術演算などの機能も必要になります。 場合によっては、変数やサプルーチン呼出しのような機 能力球められるかもしれません。 このように、アプリケーションの拡張言語といえどもか なり高い機能が必となり、けっきよくは汎用言語との 違いがなくなってしまいます。 用途が限定された小さな刻長言語ならまだしも、アプリ ケーションごとに異なる膨大な機能をもつ汎用言語を憶 えるのははとんど不可能です。 PerI で TEX アプリケーションごとに独自の言語を用意するのカ墹題 であるならは、明プログラミング言語に専用機能を追加 するというガ去が考えられます。 その一例が、 1999 年 4 月号て紹介した、、ストトンシス テム " 2 です。ストトンシステムでは、掃未な音楽言当主 「 1 ロロ を用いて楽曲を言当するのではなく、 C や Perl のプログ ラムに、、ドレミ " のようなテキストて表現した演奏データ を埋め込んて演奏機能を実現しています。したがって、た とえは、、ドレミを 100 回鳴らす " といった場合にも C や perl の制御文カ鮃リ用でき、独自の音楽言語を憶える必 要がありません。 にも、これと同様な方式が応用できそうです。っ まり、 rIbX のマクロ機能を使う代わりに Perl などの汎用 言語を用いて文章を書き、そこから TEX の機能を呼び出 すわけです。そうすれは、の英早なマクロ機能を使 いこなせなくても複雑な処理か実現できます。この方式で は、ページ番号の引算など、の内部処理についての知 識を必要とする情報は扱えませんが、マクロの置換や関数 の定義といった部分には汁闃言語の機能か利用できます。 以下では、いくっかの例を用いて PerI からを呼 び出すイ督はみの利点をみていくことにします。 2 http://www.csl.sony.co ・ jp/person/masui/Sut0ton/ 168 図 1 報告書を作成するプログラム # ! /usr/local/bin/perl # 報告書 require ' report . p1 ' ・ $name = 'PC Expo 2000 ' ・ &title("$name 報告 " ) ; &author( ' 増井俊之 ' ) ; &date( ) 2000 / 10 / 20 ' ) ; &place($loc) &t ext ( くく TEXTEND $ { 1 。 c } で開催された $ { name } に参加した . TEXTEND # スタイルファイルの呼出し $loc = ' 東京ビッグサイト , ・ # マクロ定義 &out ; 簡単な例 ます、実行するとファイルが出力される perl プ ログラムを作成します。これによって、 ' I のマクロ機 能を利用するのとはは 1 司し要領で文章を書くことができま す。 たとえば、図 1 の perl プログラムでは、簡単な報告書 の rIbX ファイルが作れます。これは Perl のプログラムで すが、、、スタイルファイル " の指定や、、マクロ定義 " のあ とで本文を記述するという点では、一勺な TFYX/L\TEX の記法と大差ありません。 こて呼び出している report. pl は、図 2 のような単 純なもので - ト分です。 制御文の利用 PerI の if 文や while 文を使えば、条件分岐や系区し を簡単にできます。条件岐や縄区しはのマク ロで言当することも可能ですが、読みやすい言去とはいえ ませんし、変数などの使用に制限があり手軽には使えませ ん。 perl を利用すると、たとえば以下のプログラムで漢字 コード表を簡単に生成できます。 print "\\begin{tabular}{ ははは \ Ⅱ \ \ れ 1 土 ne \ Ⅱ " for ($h=Oxa1 ; $h く =Oxa1 ; $ h + + ) { for($1=Oxa1 ; $ 1 く = Oxfe ; $ 1 + + ) { printf("%02X%02X & %c%c \\\\\n" UNIX MAGAZINE 2001.1
は、、、インスペクト・エンジン " と呼はれるようになりま した ( 図 6 ) 。 カーネルのなかで動くインスペクト・エンジンは、通信 やプロトコルの内容を監角財斤します。そして、通信の 状態に合わせてフィルタルールを追加したり削除できる機 能をもちました。つまり、通過するバケットを個別にヾ てフィルタリングする ( ステートレス ) のではなく、それ までの通信内容から導き出した通イ謡大態 ( ステート ) をも とに制御ルールを重加勺に生成するわけです。 ステートフル・インスペクションを用いたファイアウ ォールは、バケット・フィルタリングとプロキシーの長所 をあわせもっています。必喫なバケットだけか通過できる ので咼いセキュリティ・レベルが実見でき、ノヾフォーマン スもよく、クライアントやサーバーにファイアウォールを 意識させない透顳勺な通信路を提供できます。 たとえは、 TCP 接続を中継する場合、最初にインスペ クト・エンジンがその接続の許可 / 拒否を判断します。許 可すると判断した場合は、サーバーからクライアントへの 応答バケットを許可するフィルタルールを追加します。そ の後もインスペクト・エンジンは、中継するデータを監視 し続けます。そして、 TCP 切断要求があると、さきほど 追加したルールを削除します。 FTP などのように、逆方向からの接続があるプロトコ ルについても、インスペクト・エンジンか通信内容を監視 し、適切にフィルタルールを追加したり削除するので、ク ライアントとサーバーはファイアウォールの存在を意識せ すに通信できます。 一方、 UDP のように接続がない通信の場合についても、 要求バケットに対する応答バケットを許可するルールが追 加されます。ところが、 UDP には明示的な、、切断 " があ りません。そこで、通信力一定日判り以 E ないルールを自動 的に削除することでこれに対処します。 こう説明するといいことすくめのようですが、欠点がな いわけではありません。 バケット・フィルタリンクのファイアウォールでは、 ルータを起動しても、その前後で TCP セッションが切 れることはありません。ルータを起動している最中はデー タカヾ充れないので、そのあいだはセッションか周まったよ うになりますが、しばらく待てばもとどおりになります。 ところが、ステートフル・インスペクション型のファイア UNIX MAGAZINE 2001.1 個人の常時接続環境を考える ( 7 ) ウォールは、カーネルのなかにセッションの状態を記慮し ているため、再起動づ - るとそれらがすべて失われてしまい ます。つまり、 TCP セッションが切れてしまうのです。 これで何が困るのかというと、各ューサーに 「ファイアウォール、再起動してもいい ? 」 と訊いてまわる必要が出てきます。たとえは、あるユーサ ーカ吠きなファイルをダウンロードしている最中にいきな り、、ぶちっ " と切断すると、そこまでにかかった時間か無 駄になってしまうでしよう。かといって、いっ終るか分 からない竹喋を待ち続けるのも大変です。ああ、どうしよ う、あちらを立てればこちらが立たす・・・・・・と悩んでいる あいだに再起動すること自体を忘れてしまうかもしれませ ん。 ステートフル・インスペクションでは防げない攻撃もあ ります。たとえば、コネクションを盗聴し、始点 / 終点 IP アドレスとポート番号をうまく偽造すれば、偽のバケット をそのコネクションに差し込む ( 潜り込ませる ) ことがで きます。事実、 TeInet のコネクションを横から奪う、、コ ネクション・ハイジャック " という攻撃ではこの手法が使 われています。 このような攻撃はファイアウォールの守備範囲外なの で、ファイアウォールでは防げません。この場合は、 IPsec や ssh 、 SSL などの暗号技術を用いて防御します ( 暗号技 術に関する話題はこの特集の趣旨から外れるので、これ以 上の説明は省略します ) 。 ところで、ステートフル・インスペクションて気になる のは、プロキシーがカーネル内に移動しても、プロトコル ごとに専用のプログラムが必要になるのではないかという ことです。つまり、 Telnet を角財斤するプログラム、 FTP を解析するプログラム、 HTTP を角財斤するプログラム、 ・・のように、プロトコルの数だけ専用のインスペクト・ 工ンジンを作らなけれはならす、カーネルのなかに移動し たことで、かえって開発しにくくなったのではないかとい うことです。 しかし、 Check Point カ習寺許をもつインスペクト・エ ンジンは拡張性に優新しいアプリケーションやサーピ スを容易に追加できるように作られているそうです。おそ らく、このインスペクト・エンジンの実装がステートフル・ インスペクション技術のなかでもっとも重要な部分なので 19
第第第信第島第信 3 等第第信信信第信第信第信 : 第信 : 島第信第第 3 第第第第信第第第第第物等既島第信物 : 等、 作者 . かべさん ハッシュ関数 SHA -1 を使ってハッシュ値を計算する Sub 」 ect. sssnews コマンドの引万版てす。 ます ) 。 &kazushi/less/less-358-is0249. patch. gz から入手でき チの最新版公開のお知らせです (http://www.io.com/ 多機能ページャ less 358 の日本言群 IS02022 化パッ 作者 Kazushi Marukawa さん Message-lD. く tr 引 t8.702 」 n@sou.ne Ⅳ.org 〉 Subject:less-358-is0249 ・ jp/-znc/tcsh/ からも入手できます ) 。 6.10.00 や日本語力タログなどは http://www2.wbs.11e する、追加の日本語力タログや機旦加パッチです (tcsh 多機能 csh である tcsh の最新版 (tcsh 6.10.00 ) に対 作者楙原善之さん Message-lD: (8ve6tl$dqf$I@maiI.wbs.ne.jp 〉 Subject: tcsh ー 6 ユ 0.00 Additional ( 1 / 1 ) す。 SHOT 用のテキスト印刷フィルタのバグ修正パッチで UNIX と MS-DOS で動作する、 Canon LASER- 作者白井隆さん Message-lD. <8v3qvh$rcj$1@nsv3001.zaq.ne.jp 〉 Subject: lipsf 1.14b patch [ 1 / 1 ] きます ) 。 . waseda ・ ac ・ jp/-tom/TomSoft/TsDiary/ から入手で 新版公開のお知らせです (http://www.morito ・ mgmt WWW 上で利用できる日記作成支援システムの最 作者 . TANAKA Tomonari さん waseda. ac.jp 〉 Message-lD: (wkd7g16pzk.fsf@MAGl morito. mgmt. sion 1.01 ー 0 Release Subject: [ANNOUNCE] Tomsoft Diary System ver- dion ・ ne ・ jp/-sh-okada/ から入手できます ) 。 ソフトウェアの公開のお知らせです (http://www.d4. 機能を限定して高速に重川乍する NetNews サー 作者岡田伸也さん ne.jp 〉 Message-lD: く 2yRQ5.3809 $ P5.181688@newsl.dion ・今月の *. sources. * タイジェスト Newsgroups: 2に . sources Subject: Python- 〉 C accelerator Message-ID: くG33Z8D. En2@worId.std.com 作者 WiIl Ware さん オプジェクト指向のインタープリタ言語である Py- thon のソースを C 言語のソースに変換するフィルタで す。 Python は PerI などとは異なり、文法が C 言語 や C 十十言語に似ていて上交的分かりやすいのか特徴で すが、そのぶん C 言言の変換も容易だといえるでし このフィルタで変換できるのは Python の基本機能だ けです。そのため、すべての Python プログラムを変換 することはできませんが、フィルタが変換できる機能だ けを使っている場合は、 C 言語に変換してコンパイルす ることで高速に重川乍させられるようになります。 なお、このフィルタ自体が Python で書かれています。 Newsgroups: alt. sources Subject: Re: AnaIog music synthesizer Message-ID: く G3KFuH. 」 s5@world.std.com 作者 Will Ware さん 簡単な言語を使っていろいろな音を生成できる、、アナ ログ・シンセサイザー " プログラムです。このプログラム を使うと原音の生成やサンプリン久フィルタリン久 キシン久そしてそれらの組合をが可能です。 生成された音は、、 . wav " ファイル形式で出力されるの で、 MP3 などへの変換も容易です。 Newsgroups: gnu. emacs. SOL.lrc:eS Subject: Table 1.020 Message-lD. <uitpzvuzp.fsf@am.sony.com 作者 Takaaki Ota さん Emacs 上で、、、十 、、「などを罫に使った表を作 成、編集できる Emacs Lisp プログラムです。 このプログラムを使うと、罫で囲まれた部分をセルと して扱い、各セル内の文書をそれぞ川固別に作成、修正、 削除することができます。 WYSIWYG のワープロソフ トなどではお馴染みの機能ですが、テキストファイルで もそれができるところ叫リですれ 等第第島す第に信等島等第新新第に第第信信第信工信工島第島信を信等工信工第第エす 132 UNIX MAGAZINE 2001.1
連載 / BSD をハックする一の 図 4 週言プログラム ( 抜粋 ) #include く sys/types . h> #include く sys/socket . h> #include く sys/un. h> pass—stdio(const int sock) struct msghdr mhdr ; struct { bzero(&cmsg, sizeof(cmsg) ) ; mhdr. msg—control= &cmsg; bzero(&mhdr, sizeof(mhdr) ) ; }cmsg; int fdlist [ 4 ] ; struct cmsghdr hdr ; / * Ⅱ 0 padding mhdr. msg—controllen= cmsg. hdr ・ cmsg—len を SOL-SOCKET に、タイプを SCM-RIGHTS にし ます。ファイル・ディスクリプタを送るときは、レベル return sendmsg(sock, &mhdr, 0 ) ; fileno(stdin) ; cmsg. fdlist [ 1 ] fileno(stdout) ; cmsg. fdlist [ 0 ] cmsg. hdr. cmsg-type = SCM-RIGHTS ; SOL_SOCKET ; cmsg. hdr. cmsg—level = sizeof(struct cmsghdr) + sizeof (int)*2; 具体例 . 送信 ます。 あとは struct msgbuf を sendmsg システムコールに には同凵直が入ります。 の長さフィーノレドと、 struct msghdr の msg_controllen 補助データは 1 プロックだけなので、 struct cmsghdr sizeof (struct cmsghdr) + sizeof (int)*2 下のようになります。 ディスクリプタを 2 つ送るので、補助データのサイズは以 イスクリプタの配列か読いたものです。ここではファイル・ 補助データは、 struct cmsghdr の後ろにファイル・デ すべて 0 です。 ないので、 struct msghdr のツ曰頁の 4 つのフィールドは この例では宛先アドレスの指定は不要で、データも送ら す。引数 s 。 ck は、 UNIX ドメインのソケットとします。 ル・プログラムです。この例では標準入出力を送っていま 図 4 は、ファイル・ディスクリプタを送る側のサンフ 72 渡すだけです。 図 5 言プログラム ( 抜粋 ) #include く sys/types . h> #include く sys/socket . h> #include く sys/uio . h> #include く sys/un. h> #define MAXFD 10 int * sendfd_test (const int sock) char buf [ 1024 ] ; int n,nfd; struct msghdr mhdr ; struct iovec iov[l] ; static struct { struct cmsghdr hdr; / * Ⅱ 0 padding * / int fdlist [MAXFD + 1] ; }cmsg; bzero (&mhdr , sizeof (mhdr) ) ; mhdr. msg_iov=iov; mhdr. msg—iovlen=l ; mhdr. msg—control= &cmsg; sizeof (cmsg) ; mhdr. msg—controllen= iov [ 0 ] . iov_base=buf ; iov[0] . iov_len=sizeof (buf) ; bzero(&cmsg,sizeof (cmsg) ) ; n=recvmsg(sock , &mhdr , 0 ) ; if ( Ⅱく 0 Ⅱ mhdr ・ msg_controllen く sizeof (struct cmsghdr) ) return NULL ; nfd= (cmsg. hdr. cmsg_len sizeof(struct cmsghdr) ) / sizeof(int) ; cmsg. fdlist Cnfd] = return cmsg. fdlist ; 具体例 : 受信 オープンファイル・ディスクリプタを受け取る側の例を 図 5 に示します。 データと補助データの各受信バッフア領域と長さを msghdr に設定します。受信側でも相手のアドレスを指定 する必要はありません。 recvmsg でメッセージを受け取ったら、ます補助デー タを受け取ったかどうか msg-controllen を調べます。補 助データがない場合、 msg-control は書き換えられないの で、いきなり struct cmsghdr の長さフィールドを調べ てはいけません。 続いて、この例では省略していますが、届いた補助デー タがファイル・ディスクリプタか別のものかを石忍すべき です。また、この例では送信側からデータはいっさい送ら UNIX MAGAZINE 2001 ユ
連載 / BSD をハックする一の 図 2 パックエンド・サーパーとの (a) Close data COPY クライアント クライアント フロントエンド ティス / ヾッチャ フロントエンド ティスパッチャ バックエンド バックエンド たい相手のプロセス ID を知る去か難しいという間題が から書いたデータで前のデータを上書きしてしまいます。 生じます。受け取る側がどういうシステムコールでファイ また図 1 のように、あるプロセスか書き込みつつある ル・ディスクリプタを取り出すことにするかも悩みどころ ファイル内の好きな場所を、別のプロセスか読み取ること です。 もできます。 オ = プンファイル・ディスクリプタを複数のプロセス 用途 か共有するとは、実体としては、各プロセスのファイル・ オープンファイル・ディスクリプタをほかのプロセスに ディスクリプタに対応するオープンファイル・テープルの 渡す機能は、どのような状況で未があるのでしようか。 工ントリか 1 司しということです。 イ云糸勺な UNIX では、 fork を経由してファイル・デ ファイル・ディスクリプタを渡づ・ - 竹喋は次のようになり イスクリプタを渡すだけで事足りていました。たとえは ます。 /bin/mail コマンド 1 でメールを出すときには、メールの 1. 送り側の指定したファイル・ディスクリプタから struct 内容として与えられる標準入力を、 fork/exec を経由して file へのポインタを得る。 sendmail に渡します。 2. 受取り側のファイル・ディスクリプタの空き番号を調 rl 。 g ⅲなどサーバー・クライアント形式の多くのネット べる。 ワーク・サーピスでは、サービスを受け付けるプログラム 3. 空いているファイル・ディスクリプタに対応する struct (inetd) とサービスを提供するプログラム (rlogind) が異 filedesc の空き工ントリに、 struct 用 e へのポインタを なります。しかし、サーピスの利用ごとにサーピスプロセ 書く。 スを新規に作成するガ去をとっているので、 fork/exec で 4. ポインタで指し示される struct 用 e のリンクカウント クライアントと接続したソケットを渡すことができます。 を 1 増やす。 問題は、毎回サーバープロセスを起動することか望ま しくないようなサーピスです。古くはプリンタスプーラ この処理自体は難しいものではありませんが、どのよう (lpd) がそうです。ューザーか起動する lpr コマンドは、 な形式のシステムコールて機能を提供するかの言が困難 受け取った印刷データを常駐している lpd に渡します。 です。たとえば、 kill システムコールのように相手先プロ セス ID を指定して送ると簡単そうです。しかし、送り 1 現在の BSD の mail とは異なります。 69 UNIX MAGAZINE 2001.1
ロプログラミング・テクニック 多治見寿和 flex 前回まで、 9 回にわたって grep コマンドについて解説 しました。 grep は、パターンカ甘旨定されると、標準入力 やファイルからそのパターンが含まれる行を取り出すコマ ンドです。この処理のためにパターンを NFA に変換し、 さらにそれを DFA に変換することで高速に検査します。 この仕組みは grep コマンドにかぎらす、一ヨ殳に正規表 現のパターンを指定できるコマンドでは必須のものです。 しかし十ヾてみると、 grep コマンドのように自前てソヾタ ーンの処理ルーチンをもっプログラムはそれはど多くない ようです。パターンの処理といえはすぐに思い浮かぶ awk コマンドは自前の処理ルーチンをもっていますが、 Free- BSD で提供される awk は grep コマンドと同しルーチン を利用しています。また、ⅵや sed などはシステムのラ イプラリに含まれる正規表現ライプラリを利用して動作し ています。 さらに探したところ、 lex コマンドが grep コマンドと は異なる自前のルーチンを作成していました。そこで、 の lex コマンドを紹介することにします。ただし、 Free- BSD で利用しているのは GNU の flex というコマンド です。今回は、 flex コマンドでの入力の角斤をとりあげ ます。 f 厄 x に与える仕様 まずは flex コマンドについて簡単にみておきましよう。 lex コマンドについては 1999 年 7 月号でもとりあげま した。 flex コマンドもその動作はほは伺じです。このとき は、キーワードなどの日様を与えると、そのキーワードを 訒識する字句角斤器を生成するプログラムとして紹介しま ルじ、 した。そのなかで、トークンのパターンとして正規表現を 74 利用できるとも書きました。今回は、この処理の部分をみ ていきます。 flex コマンドに与える仕様は 1 つのファイルです。そ の内容は、以下のように大きく 3 つに分かれます。 定義部 規則部 ューサーコード部 定義部では、次の規則部を簡単に言当するために用いる 名前や、適用可能な規則を制限するために用いる開始条件 を定義します。その規則部が flex のメイン部分です。認識 するトークンのパターンと、そのパターンを認識したとき に実行するアクションの組を指定します。最後のユーザー コード部は、 flex コマンドが出力する C 言語のファイル にそのままコピーされます。 定義部で定義する名前には正規表現を割り当てます。た とえば、 NUM ALP [ 0 ー 9 ] [a-zA-Z] として、正規表現 [ 0 ー 9 ] を NUM という名前に Ca-zA- z] を ALP という名前に割り当てておけば、規則部でパ ターンを指定するときに、 {NUM} + {ALP} ({ALP} I{NUM}) * return NUMBER ・ return IDENT ; などのように、パターンの一にとして利用することかでき ます。 定義部では、、、 % { " から、、 % } " までのあいだに C 言語 ーこに書いたコードは、 のコードを自由に言当主できます。 出力されるファイルにそのままコピーされるので、アクシ UNIX MAGAZINE 2001.1