一ション

昭和61年11月1日 発 行(毎月1回発 行)
MAGAZ■
・98舶
閥 巨 倉明
干噸
覇。
.
・..一
一一一蜘
」「
i
◎墓
ー
" 側 ρ 6コ で
O 頃
ーー
ー i}
、ー ri
O Ωδ 「 σ O コ
「ー
ーー-: ∀
lー ト ー -
= o ﹄ 」 ・コ o
"ρ コα三
「1
⊆ 5 団げ 一
」 .1
LA -i
§
あ
レ
デ
蘂●U閥IXワ_ク ステーション
譲● 私 とU閥IX、
新 製 品 ⇒SO閥Y
rootか
32
(勝 一
卿?《
ら/へ、 Li廿le Language
bitワ ー クステ ー ション"閥 巨WS"
Oo⊆ コけ "
ー「
・
ロ 飴 「 σ Qり
ー「1.
ρ ︻賃コ
霧
oMx
MA6Az聞 懸
附TE瀦Vl匿w
ジ ェ イ ム ス・ゴ
ス リ ンの イ ン タ ビュ ー を お 届 け す る。冒
頭 に あ る よ うに、今
回 は 聞 き手 が ス コ ッ ト・マ グ レ ガ ー と
い う こ と も あ り、む
し ろ「対 談」と
と な っ た。エ
呼 ぶ にふ さわ し い もの
デ ィ タ か らウ ィ ン ドウ・シ ス テ ム、ユ
イ ン タ ー フ ェ イ ス に ま で お よ ぶ 彼 らの 話 は、こ
ー ザ ー・
れか らの開
発 環 境 を考 え る う え で 数 多 くの 貴 重 な指 針 を含 ん で い る の
で は な か ろ う か。
James
GOSLINGが
語る
ユ ーザ ー・イ ンターフェイス
By
Scott
McREGOR
の ま ま出 力 と して 得 られ る とい う意1嘱 この概 念 を最初
プ ロフ ィー ル
「UNIXREVIEW」誌1二
に 導 入 した の はXeroxのAltoのBravoエ
あ る)。こ れ らゴ ス リンの主 要 な3つ の プ ロ ジ ェク トの 各
イス に関 して論 じる よ うス コ ッ ト・マ グ レガ ー とジ ェ イ
要 素 をブ レン ドした 多 くの 小 型の エ デ ィタが あ る。彼 は
ム ス・ゴ ス リンに依 頼 した と き、で は どち らが どち らを
脱 在、Sul1 Microsystems社
イ ンタ ビ ュー す るの か とい う問題 に画 面 した。結 局、そ
の 興 昧は、も っぱ らウ ィン ドウ・シ ス テ ム とグ ラ フ ィッ
の 仕事 の ほ とん どがUNIXに
ク にあ る。
関連 す るゴ ス リン に焦 点
をあ て る こ とに したの だ が、そ の 選 択 も容 易 で は な か っ
た。
で1舌躍 してい る。「「ド の 彼
一 方 マ グ レガ ー は、XeroxのPARC(訳
ト研 究 所)でStarとCedarマ
ふ た りと も、ユ ーザ ー・イ ンタ ー フ ェイ スの 設計 に お
注:パ ロア ル
シ ンの 開 発プ ロ ジ ェ ク
ト・チ ー ム での 仕事 で知 られ て い る。Cedarプ
いて 多大 の 信 頼 を得 て い る。ゴ ス リンの業 績 で もっ と も
トの な か で彼 が 貢 献 したの は、Viewerウ
言,1価
され てい るのが、6年
ケ ー ジの 設計 と実 装、Tioga文:書
前 のUNIX上
のemacsエ
デ
ロジ ェ ク
ィン ドウ・パ ッ
処 理 シ ステ ム の実 装 と
ィタの実 装 で あ ろ う。こ の仕 事 は、彼 が カ ー ネギ メ ロ ン
い った 分 野で あ る。後 に彼 はマ イ ク ロ ソフ トに 移 り、マ
大 学 で計 算 機科 学の.博士 課 不
星に在 学 中 にな され た。そ
イ ク ロ ソフ ト・ウ ィン ドウ開 発 にお い て その 設計 と管理
て最 近 彼 は、"マ
し
グ リ ッ ト"と 呼 ば れ る コ ンス トレ イ ン
を担 当 した。現 在マ グ レガ ー はDECで、ア
ドバ ンス ト・
ト・べ 一 スの描 画 エ デ ィタに つ い て、博 士論 文 を ま とめ
アプ リケ ー シ ョン環 境 とアー キ テ クチ ャ に関 す る仕 事 に
て い る。そ の他 の 知 られ た仕 事 と して は、IBMのAn・
従 事 して い る。
drewシ
ス テ ム の た め のWYSIWYG型
開 発 が あ る(訳 注:WYSIWYGと
is what
6
デ ィタで
で、ユ ー ザ ー・イ ン ター フ ェ
you get"の
の エ デ ィ タの
は"What
you see
略 で、画 面 上 で 見 て い る もの が そ
(G=ジ
ェ イム ス・ゴ ス リン。R=ス
ー。た だ し、こ こで は「UNIX
コ ッ ト・マ ク レガ
REVIEW」の
イ ンタ ビ
ュア ー として の立 場 か らRと 表 記)
UNIX
MAGAZINE
l987.1
聾MX
MAGAZ田E
l閥'「ERVIEW
配
臨
瞭
..
名噛
」 多
沸.
員
犀L、...
での 原 理 とは、ユ ー ザ ーが 自分 た ちの 生 きて い る環 境 を
エ デ ィタ の 拡 張 性
拡 張 す るの に期 待 す る とい う こ とで す。つ
R:
emacsに
つ い て 考え る と、つ ね に"拡 張 性"と い
下 で、も
ま りemacs
しあ る特 別 の コマ ン ドをあ なた が嫌 い だ っ た ら、
う言葉 力偲 い浮 か び ます。こ れ に関 して、自 分 の 日標 を
そ れ を変 更 で きるわ けで す。こ れ は 多 くの 問題 を含 み な
達 成 で きた と考 え て ます か?
が ら も、多 くの実 験 や、か な りお も しろ い 開 発へ と導 く
G:
もの です。同 時 に、中 毒 的 で もあ り ます が ね。
え え、そ う思 い ます。エ デ ィタに関 す るか ぎ り、
他 に した い と思 うこ とは あ り ませ ん。と は い う ものの、
私 が 作 っ たemacsの
ます。け
拡 張 言 語 に は 明 らか に制 限 が あ り
ど、制 限 を もた ないemacsも
い くつ か あ りま
す。リ チ ャ ー ド・ス トール マ ンだ った かバ ーニ ー・グ
リ
ー ンバ ー グ だ っ た か は ち ょっ と忘 れ て し まい ま した が
(ふ た り と もMulticsでemacsの
MITの
パ イオ ニ ア)、emacsと
た め に 仕 事 を した
い うの は あ る特 定 の原 理
に基 づ くよ うな エ デ ィタで は な い と言 っ て ま した。こ こ
UNIX
MAGAZINE
1987.1
私 は 自分 の バ ー ジ ョンを書 いて い た と きに、自 問 自答
し ま した。つ ま り、「自 分 は プ ログ ラ ミン グ言 語 を作 って
い るの か、そ れ と も拡 張 言 語付 きの エデ ィタ を作 っ て い
るの か」と。そ
れ で、私 は拡 張 言 語付 きエ デ ィタ を作 る
こ とに決 め た の です。大
き くて、少 しば か り遅 く、完 壁
な もの よ りは、小 さ くて速 い もの の ほ うが よい と考 えた
の で す。
R:
emacsの
拡張 性 で、利 用 者 は本 当 に利 益 を受 け る
7
の で し ょうか。
G:
G:
実 際 に どれ ほ ど多 くの 人々 が それ を使 っ て い るの
か を知 る と驚 き ます よ。emacsを
変 更 した りして使 って
ええ。そ の よ うな景郷 ド
は 集lllして起 こ ります。た
とえ ばあ る瀞 磯.ヒ で、誰 かが あ る特 定 の機 能1こ何 か問
題 が あ る と思 う と、そ れ で実験 を始 め るわ け です。そ れ
い るの は ハ ッカ ーた ち だ けだ ろ う と思 うで し ょうが 、実
に何 人か の 人 々が続 きます。そ
際 には そ うで は あ りませ ん。じ つ に 多 くの秘 齊 た ちが、
ぐにそ れ につ い て 話 し合 う適 当 な 人数 の グル ー プ がで き
emacsに
R:
か な りのめ りこん で い ます。
あが ります。つ
エ デ ィタ をそ の まま に して お く人 と、自 分 川 に 変
してそ の 訓勢 機Lで、す
ま り、そ う して作 られ る新 しい機 能 は そ
の 副勢機 に特 有 の もの とな るの で す。一 方、並 行 して 行
え て使 う人の 違 いは何 で し ょう。
わ れ る拡 張 は 別 々の1}柳 機1で
G:
ま り、こ れ らの 剤勢機 で は それ ぞ れ別 の 新 しい機 能 を経
当初 の 忍i耐力 に 多 くか か わ って い る と思 い ます。
個 々に実 行 され ます。つ
い くつ か の符 性 にイ ラ イ ラ させ られ る と、人 は そ れ を変
験 す るの です。
更 して し まいた い衝 動 にか られ ます。も う1つ の 要 素 は、
R:
もち ろ ん好 奇心 と関係 が あ り ます。
高 機 能 ワ ー ク ステ ー シ ョンで、文 書 内へ の グ ラ フ ィ ック
R:
で は逆 に、拡 張性 の 不利 な而 は どうで しょ う。
を統 合 す る こ とが 一 般 的 に な った よ うに、emacsの
G:
え え。か な り大 きな 面で す。ま ず1つ は、適 当 な
を あ ま りに過 信 して は い ませ ん か?
ernacsの 将 来 に つ い ては ど うで す か。た とえ ば、
拡 張 性 を もった機 能 を実 装す る こ とが 困難 で あ るこ とで
G:私
す。
して い る とは 思 い ませ ん。emacsの
また、そ う した機 能 を文 書 化 す る こ と もほ とん ど
はemacsが
能力
か な らず し も巨 人 な能 力 を必 要 と
能 力 は ほ どほ どの線
不 可能 な こ とで す。rl分 で作 った コマ ン ド群 に つ い て文
をい っ て い るん じゃ ない で し ょうか。し か し私 が過 信 し
書イヒす る こ とは で き ます。し か し、誰 もが あ れや これ や
て い るの で は な い か と思 うの は、emacsの
を拡 張 す るの で、そ のemacsが
自分 の と違 って い る よ
ト・モ デル につ い て です。IBMで
ドキ ュ メ ン
仕 事 を して い る と き、
うにみ えて しま うの で す。し た が っ て、拡 張 言語 が どの
さ ま ざ まな ドキ ュ メ ン ト・モ デ ル を川 い てAndrewの
よ うな もの か文 書 化 で きた と して も、そ れ で作 られ る コ
エ デ ィタ をつ く りま した。そ の うち の1つ は 文轡 内 に構
マ ン ド群 に つ い て文書イヒす る こ とは非 常 に難 し くな るわ
造 を もつ こ とが で き る もの で、一 種 のemacsふ
けで す。こ の問 題 を解 決す べ く、ダ イナ ミ ック な ドキ ュ
の で した。バ イ ンデ ィ ング機 能 は 同様 で拡 張機 能 も もっ
メ ン ト・シ ステ ム を作 った 人 もい ます が、そ う い った も
て い ま した が、私 の 知 っ て い る 多 くのemacsエ
の は 熱狂 家 た ちの 無駄 な努 力 にす ぎ ませ ん。
ほ ど柔 軟 で は あ1)ま せ ん で した。Andrewの
本当の問題は
い るの で
み ん なのemacsが
少 しず つ 違 っ て
自分 の マ シ ンか ら誰 かの マ シンへ い っ て助
うの も
デ ィタ
ドキ ュメ ン
ト・モ デル に も、い くつ か の 間 題 が あ ります。し か し
Andrewは、私
が 考 えた3番nの
構 造 化 ドキ ュメ ン ト・
け合 うこ とが で きな い こ とです。た い て いの 場 合、コ マ
モデ ル で、そ の 適 当 な 記述 に集ll.1し
は じめ た ばか りだ っ
ン ドの 多 くは基 本的 に同 じ操 作 で 利 用 で きます。し か し、
たの で す。
メ イル を読 ん だ り、イ ンデ ン トをす る とい った特 別 な コ
マ ン ドは大 き く異 な って きます
場合 に よ っ て は過 激
ドキ ュ メ ン ト・モ
な 方法 が 使 わ れ ます。
R:
そ の 機能 は2種 類 に分 け られ る よ うで す ね。新
し
ドキ ュメ ン ト・モ デ ル に関 す る重要 な基準 は何 で
くて実 験 的 な機 能 と、テ キ ス トの 基本 的 な編 集機 能 とい
しょ う。
っ た標 蝦1勺で よ く確 立 され た もの に。と ころ で、こ う し
G:
て作 られ る新 しい機 能が、共 通 のemacsの
で す。Andrewを
ユ ーザ ー・イ
ンタ ーフ ェ イス に影 響 を与 え るこ とはあ るで し ょうか?
8
R:
デ ル と標 準 性
モデ ル そ れ 自体 が拡 張 的 で な け れ ば な らな い こ と
初 め て 書 い た とき、そ れ が 大 き な問題
で した。残 念 なが ら、私 がIBMを
UNIX
去 るまで に それ は 明 か
MAGAZINE
1987.1
口閥IX MA6AZI閥E
l四TERVlEW
「
導
茎継
1,
誠
:
薫
/飢
に は な りませ んで した。そ の 後、マ
Andrewの
隻
悔.
冨
軸
∠
イ ク・ケ イザ ー が
た が あ る オブ ジェ ク トを も って お り、そ れ が どの よ うに
ドキュ メ ン ト・モ デル に拡 張 性 を付 加 して解
提 供 され るの か わ か ら ない とす る と、そ の 型 を提 供 す る
モ ジ ュール を動的 に結 合 す る機 能 が 必 要 に な るの で す。
決 した の です。
:"キュメ ン ト・モ デル の拡 張 性 を提 供 す る こ とは非 常
R:
それ は拡張 性 に関 しての か な りよい モデ ル の よ う
に 困難 で す。と い うの も、そ の 多 くが プ ロ グ ラ ミ ング方
で す ね。し か し、そ う い った シ ス テム で作 られ た 文書 を
法 論 や、モ デ ル を実装 す る方法 にか か わ っ て くるか らで
送 る と き、相 手の ドキ ュメ ン ト・モ デ ル が 異 な る形 で実
す。マ イ クが 行 った重 要 な改善 とい うの は、ダ イナ ミ ッ
装 され て いた 場合、問 題 は で て きませ ん か。
ク・リ ンカ を実 装 す る こ とだ った の です。こ れ をUNIX
G:
この 文 書 の授 受 は 大 きな問 題 で す。
上 で行 うの は、か な り簡 単 な こ とで す。も ちろ ん、簡 単
R:
もち ろん、ダ イナ ミック・バ イ ンデ ィング は助 け
な ダ イナ ミ ック・リ ン カは、し て欲 しい と思 う こ とをす
には な ります が … …。
べ て して くれ るわ け では あ りませ ん が、そ れ で も驚 くほ
G:
どの差 が で て き ます。
して い るの か わ か りませ ん しね。す くな くと も、"イ ラ ス
R:そ
の1つ が、文 書 の 内容 に関 す る新 しい型 を リン
え え、し か しそれ が 問題 を良 くして い るの か悪 く
トレー シ ョン"と い った よ うな抽 象 的 な 名 前 を用 意 し、
クす る こ とが で き るこ とで すね。
誰 もが"イ ラス トレー シ ョン"が なに を意 味 す るの か わ
G:
か っ てい れ ば、文 書 は あ ち こち に送 る こ とが で き ます。
そ の とお りです。大 切 なの は、一 種 の オ ブ ジ ェ ク
ト指 向 の プ ロ グ ラ ミ ング・ス タ イル を使 え る こ とで、こ
R:
れ はオ ブ ジェ ク トの型 を コ ンパ イル 時 に 知 る必 要 が な い
ー シ ョン"と か、フ ォ ン トの 名 前 な どの バ インデ ィング
とい う こ とです
に つ い て共 通 の認 識 に達 す る とい うよ う な こ とが あ る と
そ して型 が その 名 前 の 文字 列 表 記 を
もとに して、動 的 に検 索 され るの で す。た
UNIX
MAGAZINE
1987.1
とえば、あ な
しか し、み ん なが"テ
キス ト"と か"イ ラ ス トレ
思 い ます か?
9
G:現
在 で は、い
くつ か の基 本 的 な こ とにつ い ては 共
G:
ええ、た しか にそ うだ と思 い ます。し か しUNIX
通 の理 解 が 成 立 し ます。し ば ら く私 は、フ ォン トの 名 前 な
は、ウ ィ ン ドウ・シ ス テム を作 って い る人 々に 多 くの 問
どで は そ ん な こ とは な い と思 っ て い たの で す が、Post・
題 を投 げ か け て い ます。
Scriptを 使 っ た経 験 か ら別 の 方法 が 見 え て きたん で す。
R:
あ な た は、そ れ に本 当 に必 要 な物 と して ダ イナ ミ
そ れ に、あ な た も認 め て い る よ うに"テ キス ト"な ど、
ック な ロー デ ィング機 能 をす で に挙 げ て お られ ます。他
基 本 的 な ドキ ュ メ ン ト項 目の 型 もあ ります し。す くな く
に どの よ うな問 題 が あ るの で し ょうか。
と も、"テ キ ス ト"を便 利 な用 語 に す る こ とは で きるん じ
G:
ゃ な いで し ょうか。
幅 の 問題 です。初 期 の 多 くの ウ ィン ドウ・シ ス テ ム、と
R:
現在 の 文書 の構 造表 現 で、も っ とも可能1生の あ る
ア ドレス空 間の 壁 とシ ス テム の低 速 通信 時の 帯域
くにゼ ロ ック スの もの は、相 亙 プ ロセ ス・コ ー ルや プ ロ
もの は何 で し ょう?
セ ス問1司期 を簡 単 に実 現 す る こ とが で きる単 一 ア ドレス
G:
本 当 に高 度 な もの は、何 もな いで す ね。
空 間 を持・って い ま した。こ れ はUNIXに
R:
ドキ ュ メ ン ト・モ デル の 関係 で、あ な たが 追 求 し
ませ ん。
て い るの は何 なの で す か。
G:
R:
今 は それ をす る時 間 もな い の です よ。Sunが
抱え
て い る問題 の1つ は、顧 客 の 多 くが 自分 た ちで 高 度 に構
そ れ は私 た ちがUNIXを
は あ ては ま り
べ 一 ス に した ウ ィ ン ド
ウ・マ ネ ー ジ ャー を作 るこ とが で きな い とい うこ とで す
か。
造 化 され た文 書 を作 り、標 準 が な い もの で すか ら、互 い
G:
に交 換 す る こ との で きる もの が1つ と して無 い こ とが あ
サ の た め に、単 一 ア ドレス空 間 での ウ ィン ドウ・マ ネ ー
い い え、そ うで はあ りませ ん。マ ル チ・プ ロセ ッ
げ られ ます。こ れ が私 が した い仕 事 で す ね。し か し今 は、
ジ ャー を作 る とい う こ とは、MESAが
ず っ と低 い レベ ル の表 記 にか か わ っ て きて い ます の でね。
た同期 機 構 を もた な いか ぎ り、難 しい とい うこ とで す。
もつ よ うな優 れ
それ は また違 った表 記言 語 を必:要とす る ところ で す が、
しか し、UNIXと
ど うあ るべ きか とい うこ とに 関 す る全帽1勺な同 意 が ま っ
ま り、か な り遅 い通 信機 能 につ い て真 剣 に考 え なけれ ば
た く見 られ な い 点 で もあ})ま す。個
な らな い と き
人 的 に は、Post-
かか わ らな けれ ば な らな い とき一
っ
メ ッセ ー ジ・パ ッシ ン グが そ れ を実 現
Scriptが 正 しい答 えだ ろ う と思 っ てい ます。
す る方 法 で あ るこ とが わ か るわ けで す。そ
R:
どの よ うな質 問 に対 す る答 え と して です か。
こ とです が、メ ッセ ー ジ・パ ッシ ング を用 い ウ ィン ドウ・
G:
して 当 り前 の
イ メー ジの グ ラ フ ィ ック的 な構 造 を表 記 す るの に
シス テム の構 築 を始 め る と、そ の ア ー キテ クチ ャは違 っ
ふ さわ しい言 語 だ と思 うの で す。そ れ は抽 象 的 な ドキ ュ
た もの とな るの です。し か し、で き あが っ た もの は それ
メ ン ト・モ テル と仮 想 ハ ー ドウ ェ アの 中 間 にあ ります。
ほ ど遅 くも悪 くもない こ とが わ か ります
R:
い るだ け なの で す。
それ に 関 して は伸 寺間 もお話 で きそ うで す が、も
っ と高 い レベ ルへ と話 を戻 しま し ょう。
R:
単 に違 っ て
ど う して そん なに遅 くな い と言 え るん で す?
明
らか に、プ ロセ ス切 り換 え はオ ーバ ーヘ ッ ドと な ります
ウ ィ ン ドウ・シ
R:
さ て、XeroxのStarが
そ れ に 続 き、よ
登 場 し て、 Macintoshが
り優 れ た ユ ー ザ ー・イ
プ さ れ て き て い ま す。こ
lO
ンタ ーフ ェ イ ス技
よね。
G:
きちん と言 い直 した ほ うが い いか も しれ ませ ん ね。
も しあ なた が、UNIX上
に単 一 ア ドレ ス空間 モ テル に基
づ くウ ィン ドウ・シ ステ ム を実 装 した と します。こ の と
ス テム が 大 き くク ロー ズ ア ッ
きあ な た は、同 期 や デ ー タ構 造 の複 製 を作 るの に多 くの
れ が こ れ か ら進 ん で い く方 向 だ
労 力 を使 い果 して終 って しまい ます。こ れ らの コス トと
術 と し て の ウ ィ ン ドウ・シ
と 考 え ま す か。
ス テム の 問 題
メ ッセ ー ジ・パ ッシ ング の コス トは釣 り合 う と私 は思 う
UNIX
MAGAZINE
1987ユ
プログラムを書こう!!UNIX Programming 砂原秀
in C 樹
ディ
レクトリの 解 剖
一.
UN1>⑦
ワァイル・シスラム
UNIXの
フ ァイル・シ ス テム 中 に 存在 す るQ云 い意 味
での)フ ァ イル に は、以 下 の3種 類 が あ る。
対応
デ ィ レク トリとは、い った い何 なの で あ ろ うか?
前述 の よ うに、UNIXで
は フ ァ イル に は特 別 な構 造 は
与 え られ て い ない。そ れ で は、フ ァ イルの 名 前 な どの 情
◇ フ アイル
報 は どこ に格 納 され て い るの だ ろ う。じ つ は、こ の フ ァ
◇ デ ィレ ク トリ
イル とフ ァイル 名 の対 応 表 を格納 して い るの が デ ィ レク
◇ 特殊 フ ァ イル
トリなの で あ る。
デ ィレク トリで は、図1に
フ ァイル は、プ ロ グ ラム の ソ ース コー ドや 実 行 モ ジ ュ
ール 、そ
して文 書 な ど を格 納 す る た め の もの で あ る。
UNIXに
示 した よ うに フ ァイ ル名 と
iノ ー ド番 号 のペ アが 格納 され て い る(4.[23]BSDの
合、可 変 長の フ ァ イル 名 を格 納 す るた め に、フ
場
ァ イル名
お け る フ ァイル は単純 なバ イ ト列 で あ り、原 則
の長 さ とい う情 報 もデ ィ レク トリ中 に格納 され て い るが、
と して オペ レー テ ィン グ・シ ス テム で は その 構 造 を定 義
利 用 者 が 直接 デ ィレ ク トリに アクセ スす る こ とは 少 な く
しては い な い。つ ま り、フ ァイル の 内 容 に意 味 を持 たせ
な っ て い る の で概 念 的 な話 に と どめ る〉。iノ ー ド番 号
るの は アプ リケ ー シ ョンの 責任 だ とい うこ とで あ る。こ
は、iノ
の、フ
格納 した構 造体 を示 す 番 号 で あ る。iノ ー ドに は、フ ァイ
ァイル に対 す るア クセ スの 手 段 は、前 回 まで に詳
ー ドと呼 ばれ る フ ァ イル の 実 体 に 関 す る情 報 を
ルの 種 類、フ ァイル の 持 ち主 の ユ ーザ ーID、フ
し く紹介 して きた。
特殊 フ ァ イル は、計 算機 に接 続 され た 入 出力 装 置 を ア
属 す グル ー プID、ア
クセ ス や 書 換 え の お こ なわ れ た時
プ リケ ー シ ョン側 か らフ ァ イル と して取 り扱 う こ とが で
刻、フ
きる よ うに した もの で、UNIXの
中 の ア ドレス の リス トが格 納 され て い る。UNIXを
大 きな特 徴 の1つ で あ
る。し たが って、フ ァ イル の生 成 を除 い た基 本 的 な人 出
図i
ァ イルの
ァイル の大 きさ、そ してフ ァイル 本 体 の デ ィスク
解説
デ ィ レ ク ト リの 内幕
力装 置へ の ア クセ ス は、前 回 まで に紹 介 して きた 手法 で
お こな うこ とが で きる。た だ し、入 出 力装 置 に特有 の 処
理(た
とえば、端 末 装 置 の ボ ー レー トの設 定)を お こ な
4
.1
8
.,1
うた めの 機 能 が 用意 され て い る(こ れ をお こ な うため の
384
963B
シ ステ ム コ ール がioct1で あ るが、こ れ らの 特 殊 フ ァ イ
201
ル 特 有の 処 理 に つ い ては、本 連 載 で い ず れ解 説 を加 え る
445
.cshrc
.login
mailbox
tmpI
l
1
予 定 で あ る)。
さて、残 る1つ の デ ィレ ク トリが 今 回 の対 象 で あ る。
UNIX
MAGAZINE
l987.12
75
願
齢
プロ燐
客 う!!一
⑦
図
糠 ㌻ ∼ミ
む
謡
図41inkの
実 行
》 づ
、壷、
/
.cshrc
mbox
した書籍 で フ ァイ ル・シ ス テム の 図 と して 図2に 示 した
よ うな もの を よ くみ か け るが、上 記の よ うに考 え る と、
正 確 には 図3の よ うに表 示 しな け れば な らな い わ けで あ
新 し くつ く られ た
リン ク
る(フ ァイル そ の もの に名 前が 付 け られ て い るの で は な
く、フ ァイル を示 す リン クに名 前 が 付 け られて い る)。
と ころで、フ
0を リター ン値 と して返 す。以 下 の よ うな シス テ ム コー
ル を実 行す る とフ ァイ ル・シ ス テ ムは 図4に 示 した よ う
ァイル 名 とフ ァ イル の 実体 の 対 応 は、か
な らず し も1対1で
な くと もよ い。図3で
もル ー ト・デ
に な る。
ィレク トリを指 し示 す 矢 印(リ ン ク)が 複 数 存 在 して い
link
る よ うに、1つ
(1「/usr/public/・login,1,
幽
ソusr/suna/publogin同);
の フ ァイ ル 実体 にい くつ かの フ ァイル 名
を与 え る こ とが可 能 で あ る。こ の よ うに、す で に存 在 し
ま た、ス
て い る フ ァイ ル に もう1つ 新 た な フ ァイル 名 を与 え るた
fname
め の シス テ ム コ ール がIinkで
ー・ユ
あ る。
ー パ ー・ユ
ー ザ ー に よ る 実 行 で な い か ぎ り、
1は 普 通 の フ ァ イ ル で な け れ ば な ら な い。ス
ー ザ ー の 場 合 は 、fname
ーパ
1に デ ィ レ ク ト リ を 指 定
す る こ とが で き る が、
1ink (fname1, fname2)
char *fname1, *fname2;
1ink("ノusrl「,"/usr/s㎜a/work/pubusrs");
fname
1は す で に存 在 して い る フ ァ イル の 名 前 で あ
り、fname
2は 新 し く付 け るフ ァイル 名 で あ る。1inkシ
の よ うな シ ス テ ム コー ル を実 行 す る と、図5に
うな リンクの ル ープ が で きて しま うの で 注意 が 必要 で あ
ス テム コール は実 行 に失 敗 した場 合 一1を、成功 した場合
図3
フ ァイ ル・シ
「而
○
る(cp-rやls-Rな
ス テ ム(正 確 な 表 現)
酬bOX
咽
課
\ 一'
)
D(}ど
窪1<㍉
、一
又_ __/
76
リン ク の ル ー プ
φ咽
等〆 詫
一「
ど、デ ィ レク トリをた ぐっ て い く
図5
一
示 した よ
この よ うな リ ンクr
の ル ープ がで きる
.〈
忌
UNIX
MAGAZINE
l987.12
磯
翻
嚇
艦 う!!一
⑦
図6
\
と
\
\ ,
\ )
)
ノ
ス テム
/
(
論 理 フ ァ イ ル・シ
\
,
\
/7沃
\、
\
/
ー
坤
覧 、
)
.讐/,\
や
寵
ρ 〉ぐ
/
、と:二)\
\
\
\◎
b竿ン隙
論理 フ ァイル・シ ステム
利 用 者 か ら 見 た フ ァ イ ル・シ
ス テ ム、
コマ ン ドが 終 了 しな くな って し まう)。
理 フ ァ イル・シ ス テ ム に分 割 し、フ ァイル・シ ス テム の
一.:.}・に
管 理 を容 易 に してい る(UNIXシ
Σ.,ぎ..甚
三-・討
辱
馳
藁磐'・嘩
患.「』
まやかし
な っ て い る と きに、一 般 の利 用 者 が デ ィス ク を使 い きっ
て し まい、UNIXの
とこ ろ で、UNIXの
ス テム の・再構 築 を お こ
フ ァイル・シ ス テ ムは 利 用者 か ら
は1つ の木 構 造 に 見 え るが、実 際 に シ ス テム に接 続 され
再 隣築 が で きな くな っ て しま うこ と
は管 理 上 大 きな 問題 で あ る。そ こで、あ らか じめUNIX
シス テ ム用 と利用 者 用 の 論 理ワ ァイル・シ ス テ ム を分 割
て い るデ ィス ク装 置 は複 数 の場 合 が あ る。こ の よ うな と
して お くこ とで、利 用 者側 の論 理 フ ァ イル・シ ス テム が
きに、こ れ らの 複数 の デ ィス ク装 置 で木 構 造 の 一 部(部
溢 れ て も、UNIXシ
分 木)を 分 担 して 格納 す る こ とで、利 用者 か らの フ ァイ
に は影響 を与 えな い よう にす る こ とが で き る)。
ル・シ ス テ ムの 見 え方 を一様 に保 って い るの で あ る(図
6参 照)。UNIXで
は、こ れ らの複 数 の デ ィス ク装 置 を論
ス テム 用 の 論理 フ ァ イル・シ ステ ム
じつ は、前 述 のlinkシ
ス テム コール は この論 理 フ ァ イ
ル・シ ス テ ム を越 え て リ ンクの 設 定 を お こ な う こ とはで
理 フ ァ イル・シ ス テム(俗 にパ ー テ ィシ ョン と呼 ばれ る)
きな い(図7参
と呼 ぴ、単 に シ ステ ム に接続 された複 数 の デ ィス ク装 置
理 フ ァ イル・シ ス テ ム で別 々 に管 理 され て お り、同 じiノ
を意 味 す るだ けで な く、1つ
の デ ィス ク装 置 を複 数 の論
論 理 フ ァイ ル・シ
由 は簡 単 で、iノ
論 哩7-4ル・ノ
MAGAZINE
l987.12
楽○
UNIX
ス テ ム2
ス テ ム1
ス テ ム を越 え た リ ン ク
\
論 理 フ ァ イ ル・シ
ー ド番 号 は各 論
ー ド番 りで も異 な る論理 フ ァ イル・シ ステ ムで は 異な る
一
図7
照)。理
○
\
この よ うな リ ン ク
を設定 す るこ とは
で きな い
\
77
□ 騨 加 燐 罰・ト⑦
フ ァ イル を示 す か らで あ る。そ こで、こ の よ うな論 理 フ
ァ イル・シ ス テ ム を越 えた リン クの 設 定 を実 現 す る ため
に考 え られ た の が、4,2BSDで
ク・リ ンク で あ る(linkシ
導 人 され た シ ンボ リ ッ
ス テム コール で設 定 され る リ
ン クは、ハ ー ドリン ク と呼 ばれ る)。
こ の シ ン ボ リ ッ ク・リ
symlinkシ
1stat(fname,
buf)
char
*fname;
struct stat
*buf;
シ ン ボ リ ッ ク・リ
ン ク を設 定 す る た め に は、
ス テ ム コール を利 川 す る。
テ ム コ ー ル がreadlinkで
リ ン ク の パ ス 名、bufは
レ ス、sizeは
sym=Link
char
(fname1,
*f夏ame1,
ン クの 内容 は リンク した先 のパ ス名
が 格 納 さ れ て い る だ け だ が、そ
fname2)
れ を読 み 出す た め の シス
あ る。 pathは
バ ッ フ ァ の 大 き さ で あ る。 readlinkシ
ム コ ー ル は 実 行 に 成 功 す る と、読
*f夏ame2;
lは シ ンボ リ ック・リ ンク を設 定 す る先 の フ ァ
イル の 名 前 で あ り、fname
2は 新 し く付 け る フ ァ イル 名
(シ ンボ リック・リ ン クの 名前)で あ る。symlinkシ
ステ
ム コー ル は 実 行 に 失敗 した 場合 一1を、成功 した 場合0を
ン ボ リ ッ ク・リ
ン ク に 対 す るstatシ
号 参 照)で、fnameに
ステ
み 込 ん だ 文 字 数 を 返 し、
そ う で な い 場 合 は 一1を 返 す。lstatシ
fname
シ ン ボ リ ッ ク・
読 み 込 ん で く るバ ッ フ ァ の ア ド
ス テ ム コ ー ル は、シ
ス テ ム コ ー ル(10月
シ ン ボ リ ッ ク・リ ン ク の パ ス 名 を指
定 す る 以 外 は 同 じで あ る。
一・f「.亀
今=.=》=・=」...,
=rL、L・.∵・:・.;.=∫「「、.
L⊥・...n二・i
生滅
リター ン値 と して返 す。
シ ンボ リック・リ ン クは、ハ ー ド リンク と異 な り一 般
の 利 用 者 で もデ ィ レク トリに対 して リ ンク を設 定 す る こ
とが 可 能 で あ り、前 述 の よ うに論 理 フ ァイル・シ ス テム
を越 え て設 定す る こ と も可能 で あ る。し か し、シ ンボ リ
ッ ク・リ ン ク で は リン ク先の フ ァ イル 名 が 指示 され て い
るだ け で、リ ン ク され て い る側 で は それ を関 知 してい な
い。し たが っ て、リ ンク した先 の フ ァ イル が な くて も設
定 で きて しま うの で 注意 が 必 要 で あ る(ハ ー ドリン クで
は、も との フ ァ イル が削 除 され て しま って も、他 の リン
デ ィレク トリの作 成 や 削 除 をお こ な うに は、以 下 の シ
ス テム コール を利 用 す る。
mkdir
char
int
(path,
pmode)
*path;
pm◎de;
rmdir
char
(path)
*path;
mkdirシ
ス テ ム コ ール はデ ィ レク ト リを作 成 す るシ
クが 残 って い るた め に フ ァ イルの 実 体 が な くな る こ とは
ス テ ム コ ール で、pathが
な いが、シ
名、pmodeは
ンボ リッ ク・リ ンク で は、リ ンク した 先 の フ
作 成 す る デ ィ レク トリの パ ス
作 成 す るデ ィ レ ク ト リの 保護 モ ー ドで あ
ァ イル が 削 除 され て しま う とフ ァイル の 実体 まで な くな
る。た だ し、実 際 に作 成 され た デ ィ レク トリの 保 護 モ ー
って しま う)。
ドに は、creatシ
シ ンボ リ ック・リ ン クを設 定 して お くと、こ れ まで に
ぽす。rmdirシ
ス テム コ ール 同様、 umaskが
影響 を 及
ス テ ム コー ル は デ ィレ ク トリを削 除 す る
紹 介 した よ う なフ ァ イル を ア クセ ス す る シ ステ ム コー ル
シス テ ム コー ル で、pathは
削 除 す るデ ィ レク トリのパ ス
で はハ ー ドリン ク と同様 に、直 接 リン ク した 先の フ ァ イ
名 で あ る。デ ィ レク トリの削 除 をお こな う場 合 に は デ ィ
ル を ア クセ スす る。し た が って、シ ン ボ リック・リ ン ク
レク トリの な か に フ ァ イル が な い状 態(空 の デ ィ レク ト
その もの に ア クセ ス した い場 合 に は特 別 の シス テ ム コー
リ)に な って い な けれ ば な らな い。と もに、シ ス テム コ
ル を利 用 しな けれ ば な らな い。
ー ルの 実 行 に 成功 した 場 合0が
cc
=readlihk
ユnt
char
int
(path,
CC;
*path,
size;
buf,
size)
ー ン仙 と して返 され る
。図8に
78
rmdirコ
マ ン ドの プ ログ ラム を示 す。こ の プ ログ ラム は1っ で あ
*buf;
るが、以..ドの 羽 順で コ ンパ イル す る。
梶cc-o
#include
#include
、失 敗 した場 合 一1がリタ
簡 単 なmkdir、
mkdir血kmdir.c・
〈sys/types.h>
<sys/stat.h>
UNIX
・プ ログ ラム を コンパ イル。
実 行 フ ァイル名 はmkdir。
MAGAZINE
1987.12
D連
載/プロ
舩
訓
一⑦
対 応 す る。fnameは
図8
簡 単 なmkdir、
rmdirの
ア ク セ ス し よ う とす る デ ィ レ ク ト リ
プ ロ グ ラ ム
の パ ス 名 で、stdioのFILE構
#define
PMODE
体 が 返 さ れ、以
main
(argC,
1nt
char
ま た、デ
降 の 処 理 は こ れ を 利 用 し て お こ な わ れ る。
int
i;
int
rflag
=
(ホargv[0]
rflag
(i
if
==
,r,)
{
/*should
be
Imdir*!
て 得 ら れ たDIR構
= 1; i く argc;
(rflag
== 0) {
i 壱+) {
!* mkdir
ト リの1エ
寧/
!ホ 副irホ/
やiノ
さ れ る値 は デ ィ レ ク
造体へ
造 体 に は フ ァ イ ル 名(d-name)
ー ド番 号(d.ino)な
どの 情 報 が 格 納 さ れ る(そ
他 の 要 素 は シ ス テ ム に よ っ て 異 な る)。ま
}
た、デ
closedirは、
mkdir
mdir…
… ファ イルmkdirに ハ ー ドリン クを
設定 し、同 じファ イル にrmdirと
い う名前 も付 け る。
こ の よ う に す る こ と で、1つ
確 に は、実
始 ま っ て い れ ばrmdirの、そ
場 合 はmkdirの
の で、ア
イ ブ ラ リのfcloseに
同 様、
構 造 体 で あ る。な
行
れ以 外 の
h>は
.. .:. ..・..
opendirで
お、System
〈direllt.h>、
struct
対応 す る も
V
得 ら れ たDIR
Rel.3で
は 〈sys/dir.
direlltと
な
こ れ ら の ラ イ ブ ラ リ を 利 用 し て、カ
レ
っ て い る。図9に
ン ト・デ
働 き を す る)。
一
stdioラ
返 さ れ る。
ク セ ス の 終 っ た デ ィ レ ク ト リの 後 始 末 を お こ な
う。dirpはreaddirと
の フ ァ イ ル がmkdirと
両 方 の 働 き を す る こ とに な る(正
フ ァ イ ル 名 がrで
の
ィ レク ト
リの 最 後 ま で 読 ん で し ま っ た と き はNULLが
}
rmdirの
造 体 で あ る。返
よっ
(argv[i]);
}
%1n
ン ト リ分 の 情 報 を
ン ト リ分 の 内 容 を 格 納 す るdirect構
の ポ イ ン タ で、diect構
(argV[i],PHODE);
{
rmdir
ィ レ ク ト リか ら1エ
読 み 出 して く る ラ イ ブ ラ リで、dirpはopendirに
}
mkdir
返 さ れ る。
readdirは、デ
0;
31;
}
else
ィ レ ク トリへ の ア ク セ ス が で き な い と き は
NULLが
{
for
造
argv)
argC;
*argv[〕;
if
造 体 に対 応 す るDIR構
O644
ィ レ ク ト リのiノ
directはstruct
ー ド番 号 と フ ァ イ ル 名 の リ ス
ト を表 示 す る プ ロ グ ラ ム を示 す。
誰がいる?
ま た、さ ら にstdioラ
イ ブ ラ リのftell、
fseek、
rewind
に 対 応 す る 以'ド の ラ イ ブ ラ リが 用 意 さ れ て い る。
最 近のUNIXで
Rel.3で32文
は、フ ァ イル 名 の 長 さはSystem
字、4.[23]BSDで
は255文
V
字 まで 許 さ
れ る よ うに な り、デ ィレ ク トリの 構 造 は 非 常 に複 雑 に な
っ て きて い る。そ の ため、デ
ィ レク トリの な かか らフ ァ
イル 名 を取 り出 して くるた め の以 下 の よ うな ラ イブ ラ リ
が用 意 され て い る。
#include
<sys/types.h>
#include
<sys/dir.h>
10㎎telldir(dirp)
D工R
*dirp;
… … 現;在の位 置 を報 告
seekdir(dirp,10c)
DIR
*dirp;
… … 現在 の位 置 をIocに 変更
図9
デ ィ レ ク ト リ・ア
ク セ ス の例
"include
<sys/types,h>
謬iaclude
#include
〈3ys/dir.h>
<stdio.h>
main
O
{
DIR
*opendir(fname)
char
*fname;
DIR
零dp;
8truct
direct
if
struct
DIR
direct
*readdir
(dirp)
ゆdent;
((dp
= opendir(電1.冊))
fprintf
(stdeコ コ2,→
鱒can,t
find
exit
(1);
*dirp;
curreロt
器
四UI』L) {
directory\
取ol);
}
closedir
D工R
(dirp)
鷲hile
*dirp;
((dent
printf
= readdir
(II%d:%s\
(dp))
1冨 ㎜L)
駆,o, deat
一〉(しino,
dent一>d_乱ame);
{
..卜
}
opendirは、デ
ィ レ ク ト リに ア ク セ ス を お こ な う と き
に 最 初 に 実 行 す る もの で、stdioラ
UNIX
MAGAZINE
1987.12
c】.osedir
(dirP)}
イ ブ ラ リのfopenに
79
職
10ng
磁/プ ロ
グ弘㈲
ト⑦
loc;
図10(a)デ
.,一
の最 初 に変更
こ の 他、4.[23]BSDに
はscandirと
ブ ラ リが 用 意 さ れ て い るが、こ
こ れ で、ひ
ィ レ ク トリの 木 構 造 の 例
… … 現在 の位 置 をデ ィレク1・リ
revinddir
(diエp)
DIR
*dirp;
・∼爽
い う便利 な ラ イ
一
こ で は 宿 略 す る。
と と お りフ ァ イ ル、デ
で き る よ う に な っ た 思 う。み
一
(22レ ント・デ ィレク ト1ゐ)
(」堕ake「lIe
ィ レ ク ト リの 操 作 は
な さ ん で、面
maln二C(魍
♪
白いプ ロ グ ラ
図10(b)treeの
実 行 結 果
ム を 考 え て 作 っ て み て い た だ き た い。
サ
次 回 は、プ
ロ セ ス の 話 に 人 る 予 定 で あ る。な
号 の 本 連 載 で ま た ミス あ っ た(申
が、今
お、先
月
回 は 僕 の ミ ス で は な い)。92ペ
l一〉 .10gin
一>work
ー ジ に"FEOFO"
ラ イ ブ ラ リ と あ る の は、正
し くはfeofOで
て お い て い た だ き た い(ご
迷 惑 を お か け い た し ま した。
あ る。訂
筆 者 な ら び に 読 者 各 位 に 謹 ん で お 詫 び し ま す。編
集 部)。
図ll
lI月 号 の 宿 題 の 解 答
#include
B.W.Kernighan
and
D.M.Ritchie:"The
C
Language",Prentice-Ha11,1978(邦
石 田 晴 久訳
『プ ロ グ ラ ミ ン グ 言 語C』
University
of California,
grammer's
Reference
main()
{
float
char
共 立lll版)。
Manua1",4.3BSD,
Design
of the
UNIX
for
April,
UNIX』
純、井
上 尚 司、砂
(;;)
Operating
fprintf
(stderr,
exit
(0);
『プ ロ フ ェ ッ シ ョナ ル
switch
(OP[0])
case
,十,:
printf
break;
case
,陶,:
留 題1ヨー か 口
鱒
リをた ど って い き、す べ て の木 構 造 を表 示 す るプ ログ ラ
ム をつ くって ほ しい。た とえ ば、カ レ ン ト・デ ィレ ク ト
ィレ ク トリは何 頭:に
}
printf
break;
default:
も作 られ てい るか も しれ ないの で、注 意 が 必要 で あ る。
[11月 号 の宿 題 の 解 答]
(,。= %f\nl㌧ a!
fprhitf(stde叫
"uh㎞。㎜operator\n'書);
b
reak;
示 す。数 字 と記 号の あ い
だ は空 白な どが あ る こ と を前 提 に して い る。ま た、整 数
b);
蹄
}
で も浮 動 小 数 と して取 り込ん で い る。
(誌面の都合上、リ ス トの一部を"1.ウ"で
折 り返 しています)
夏o㌧a-b);
fprintf
(stderr,
吋
巳ldivided by zero\n91);
break;
よ うに な っ て い る と き に 図10(b)
前号 の 宿 題 の 解 答 を図11に
('』%f\nl㌧a+b);
printf
('』 捧f\筑'㌧a*b);
break;
case,/,:
if (b嘗 雷0)
{
しよ う。カ レ ン ト・デ ィレク トリか ら、順 に デ ィレ ク ト
の よう な出 力 が得 られ る と よい。デ
{
printf(1曾=%f\
break;
case
,*,;
今 月の 宿 題 は、「ftree」と い うプ ロ グ ラム を作 る こ とに
80
op, &b)
==EOF){
1へnbye\nlI);
}
原 秀樹
ア ス キ ー 出 版 局、1986
リの 下 が 図10(a)の
{
fprintf
(stderr,
1。? ,1);
if (scanf
(騨Xf%s%fol, &a,
System",Prentice-Ha11,1986.
村井
a, b;
OP[16];
Pro-
1986.
M.J.Bach:"The
<stdio.h>
Pro訳:
Berkeley:"UNIX
l
l一> Makefile
l一> main.C
l一> sub.c
正し
<<参 考 文 献>>
gramming
ト 〉.cshrc
し訳 な い か ぎ りで あ る
}
}
UNIX
MAGAZINE
l987.12
I nternetのworm騒
動
加藤 朗
算機 の なか に侵 人す る。そ して、あ るプ ログ ラ ム を相 手
は じめ に
ill算機Lに 転送、コ
ンパ イル して実 行 す る。こ の プ ログ
ラム は感 染 元 の計 算機Lのwormと
通信 し、そ の コ ピー
を転送 し、そ れ に制 御 を移 す。こ の よ う な形 で"感 染"
新 聞 や ニ ュ ー ス 等 で 広 く報 じ ら れ た よ う に、11月211
夕 刻 か ら 米1…1三1のInternetが マ ヒ す る と い う 騒 ぎ が あ っ
が お こ なわ れ、そ れが ネ ッ トワ ー ク.ヒに波 及 して い った
た。こ
の で あ る。
の た め、ARPANETやCSNETな
ど を 含 む
Internetが
機 能 を … 時網`ll=し、そ
の」1又拾 まで2Hほ
か っ た。そ
の 騒 ぎの 張 本 人 は、実
は コー ネル 大学 の 人 学
院 生 の 書 い た ほ ん の ち ょっ と し た 一
い一
し か し結 構 す る ど
プ ロ グ ラ ム の せ い だ っ た。
Virus"と
とい う こ とが さ っ ぱ りわ か ら な い。単
の プ ロ グ ラ ム をvirusと
呼 ぶ な ど、マ
な 過 人 な 報 道 姿 勢 が 目 に つ く。む
ほ ど の 人 は、そ
は1可 か、
どの ホ ス ト情 報 が 書 か
netSτaτを 実 行 し て ネ ッ ト ワ ー ク 情 報 を 収 集 し た り、ま
に携 わ る
た.forwardや,rhos。sを
の カ モ を 見 つ け る。お
検 索 した り も す る ら しい。
感染の手段(1)
Wormが
カ モ に感 染 す る とき には、一 部 で は矢ilら
れて
い たUNIXシ
何 が 起 き た か"と
い う こ と を、
新 聞 な ど よ り は い く ら か 技 術 的 に 伝 え て み た い。ニ
ど のUSENET、
ュー
ステ ム に 存 在 して いた 穴 を利 用 して、ま
ず1iStenerと 呼 ばれ る小 さな プ ロ グ ラム をカ モ 訓蟄機 上
に 転送 す る。そ の方 法 と して は、次 の よ うな3つ の 方法・
が使 われ た。
JUNETの
問題 の プ ロ グ ラム を 人 手 し
て 解 析 した わ け で は な い こ と を あ ら か じめ お 断 わ り し て
お く。
●fingerdの
虫 を利 用 す る方法
fingerは 刮算 機.ヒ の ユ ー ザ ー に 関 す る情 報 を 得 る サ ー
ビ ス で あ る。fingerが
RTM,s
Computer
wormの
戦略
れ た と き に は、そ
virusの.fE確 な、し か もひ ろ く合 意 を得 た
単 な るユ ーザ ー 名 を引 数 に起 動 さ
の 詐 算機.ヒ の ユ ー ザ ー に 関 す る 情 報 を
表 示 す る。一 方、ユ
ー ザ ー が 引 数 を μ鮮@乃0∫'の 形 式 で 与
え た 場 合、fingerは
乃o∬計 算 機 一ヒの サ ー バ ー・プ ロ グ ラ ム
定義 が 存 在 す るの か ど うか は よ く分 か ら ない が、「ほ かの
で あ るfingerdと
プ ログ ラムへ の 付 著」がvirusで
ユ ー ザ ー の 情 報 を 得 る こ と が で き る。
あ るため の 条件 の1つ
ら しい。し た が っ て、今 回 の 問題 の プ ロ グ ラム(こ こ で
は、作 者 の頭 文 字 を とっ て「RTM's
にす る)は、い わ ゆ るvirusで
worm」と
呼 ぶこ と
は な く単 な るwormで
あ
る と解 釈 され て い る よ うた』
RTM's
UNIX
まけ に
何 が起 こ っ たの
て 少 数 で あ る こ と に 驚 か さ れ る。
ニ ュ ー ス 記 事 で あ り、私rl身
は/etc/hosτs、/eτc/hos亡s.equivな
ス コ ミ に あ りが ち
い う こ と を あ る不㌔
渡 で も理 解 し て い る 八が き わ め
ス ソ ー ス はcomp.risksな
に感 染
数)を 決 定 す る。こ の た め、worm
な る トロイの 木 馬
ろ ん、言1勢'機
実 に は"lnternetで
こ こ で は"lnternetで
あ る1}1算 機.ヒ に 感 染 したRTM'swormは、次
れ た フ ァ イ ル を 検 索 し、次
の 状 況 を 正 し く判 断 して ヌ・1応し て い る と
信 じた い の だ が、現
感染先計算機の決定
す べ き 計 算 機('11然、複
最 近 の 新 聞 報 道 で は、"Computer
か"と
どか
wormは
MAGAZINE
い くつ か の 力鞍 を使 って、相 手の 計
1989.1
Wormは、
通 信 を お こ な う の で、遠
fingerか
よ う な 高 級 な(?)手
隔 計 算機 上 の
ら得 られ た情 報 を解析 す る とい う
法 は 用 い て い な い。fingerdに
潜んで
い た 落 し穴 を巧 妙 に 利 用 し た だ け で あ る。
fingerdは、引
ら 読 み 込 む。も
数 と して の ユ ー ザ ー 名 な ど を標 準 入 力 か
ち ろ ん、fingerdの
標 準 人 力 や 標 準llll力
69
■lnternetのworm騒
は、inαdか
動
ら 起 動 さ れ た デ ー モ ン の 例 に よ っ て、ソ
トに 結 合 さ れ て い る。fingerdは
込 む 部 分 でgetSを
ケ ッ
標 準 入 力か ら引数 を読 み
使 っ て い た。こ
入 す る こ と は で き な い が、た
sendmailに
はdebug機
ま た まVAX2やSunの
能 が 残 っ て い た た め、 wormに
れ が 隠 れ た 落 し穴 で あ
わ れ た の で あ る。
違 い は ご 存 じだ と思 う
● パ ス ワ ー ド破 り を す る方 法
狙
っ た。
本 誌 の 読 者 な らgetSとfgeτsの
が、getSは
バ ッ フ ァ 長 の 検 査 を し な い。し
フ ァ 長 よ り も長 い デ ー タ が き た 場 合、バ
た が っ て、バ
域 を 読 み 込 ん だ デ ー タ で 破 壊 し て し ま う。た
gerdの
バ ッ フ ァ はauto変
長 い 入 力 を 与 え る と、ス
ッ
ッ フ ァ以 外 の 領
ま た ま、fin-
数 と し て 定 義 さ れ て い た の で、
タ ッ ク の 内 容 を 破 壊 し て い き、
や が て は 関 数.mainOの
戻})番
地 を破 壊 す るこ とに な
る。
ユ ー ザ ー の パ ス ワ ー ドを 盗 む と い う 一 番 単純 な 方 法 で
あ る が、な
(悪?)例
ま い 具 合 に/bin/shをexecす
ド を バ ッ フ ァ に 書 き 込 み、戻
る よ うな コ ー
り番 地 を 本・来 の もの か ら、
バ ッ フ ァ 中 の コ ー ド を指 す よ う に 樽 き 換 え る。す
関 数 一main
Oが
終 了 す る と、め
こ と が で き る、と
で た くshを
RTM's
手 に入 れ る
い う 次 第 で あ る。
こ の 方 法 は 計 算 機 のCPUに
wormの
Sunや
る と、
試 み はVAXに
ち ろ ん、パ
ス ワ ー ドの つ い て い な い
対 して は 成 功 す る が、
dumpと
る。そ の た め、負ngcrdのcoreが/coreと
い う結 果 に 終
して残 る とい う
こ と に な る。
て も簡 単 に 破 られ て し ま う場 合 が 少 な く な い。そ
"普 通 の 英 単 語"や"イ
wormは
ま ず、よ
く使 わ れ そ う な 単 語 を 試 し
て み る。そ れ で も駄 目 な ら/usr/diCt/w・rdsに
単 語 を 試 し て み る。あ
る い はcshの
接 続 さ れ た 言1勢機 間 の 電 子 メ ー ル の
交 換 をSMTP1と
い う プ ロ ト コ ル に も とつ い て お こ な
う機 能 を も っ て い る。SMTPの
debugと
機 能 の 一 部 で は な い が、
は メ ー ル シ ス テ ム の デ バ ッ グ を補 助 す る
い う 機 能 が、一DDEBUG付
き で コ ンパ イ ル さ れ
wormは
ロ ー カ ル な/eτc/passwdを
ド破 り を 試 み る。そ
ザ ー に な1)す
コ ネ ク シ ョ ン を カ モ 計 埠 機 のsendmai1と
り、debugモ
ー ドに す る。そ の 後、し
な う と、カ モ 副 鯛 機 上 で 間 接 的 にshを
こ で、SMTPの
の ソ ー ス・プ
張
lRFC821で
頼 りに
こ にIlsτenerプ ロ グ ラ
行 す る。
感 染の手段(2)
一Lで述 べ た 方 法 で カ モ 計 算 機 上 に ア ク セ ス を 得 た
wormは、
hsτenerプロ グ ラム を実 行 す る。ご の と き、引
数 と して感 染元 の 計 算機 の ア ドレス と ポー ト番号 な どが
渡 され る。hStenerプ ロ グ ラム は そ こ で、 wormの
を作 るた め、感 染 元 のwormに
wormを
コ ピー
対 して コ ネク シ ョン を張
ログ ラム を転 送 す る。こ の 転 送 にはXOR
し て、転 送 した
起 動 す る こ とに よっ て、感 染 が 完 了 す る。
RT:M's
起 動 で きる よ う に
wormの
症状
コ ネ ク シ ョ ン を 利 用 してhstener
ロ グ ラ ム を転 送 し、コ
ン パ イ ル し、そ
れ を
今 回 のRTM's
wormは
と くに 悪 さは しなか った。計
算 機 か ら劃御 機 へ とた だ感 染 を繰 り返 す だ け で、フ ァイ
能 が な いsendmailに
定護 されてい る。
対 して は この 方 法 で 侵
ル を消 した り修 正 した りす る よ う な"悪 い"お こ ない は
24,3BSDのdistributionに
一DDEBUGな
70
走 っ て い るの
か る べ き会 話 を お こ
起 動 す る。
debug機
ン パ イ ル、実
ス ワー
その ユ ー
の よ う な こ とが 必 要)、.rhOStSを
を 利 用 したll音
号 も使 わ れ た ら し い。そ
狙 わ れ た。
な る。そ
検 索 し、パ
れ が 成 功 す る と、wormは
ま し(実 は、wormはrootで
1,、wormプ
た バ ー ジ ョ ン に は 付 加 さ れ て い る。こ の 機 能 がwormに
SMTPの
よ
の
い うプ ロ グ ラ ム が 用 意 さ れ て い る。こ の
プ ロ グ ラ ム は、IPで
sendmai1に
よ う なUNIXの
単.に パ ス ワ ー ドが 発 覚 し て し ま う。
ム を 送 り、コ
の 計 算 機 な ど に は、電.了・メ ー ル の 配 送 を お こ
な うsendmailと
載 っている
く知 ら れ た コマ ン ド名 や フ ァ イ ル 名 を 試 して み る。こ
rshを 実 行 で き る計 算 機 を探 し、そ
穴 を 利 用 す る方 法
4BSD系
れ は、
ニ シ ャル な ど 名 前 か ら推 定 で き る
パ ス ワ ー ドに 使 わ れ る 場 合 が 多 い か ら で あ る。
RTM's
で は な い の で、こ
●sendmailの
ス ワ ー ドは つ い て い
よ う な パ ス ワ ー ドを 使 っ て い る ユ ー ザ ー が い た 場 合、簡
依 存 し て い る の で、
そ の 他 の 計 算 機 で はcore
で あ る。も
ア カ ウ ン ト と い う の は ひ ど い が、パ
もの"が
そ こ で、う
に も凝 っ た こ と を しな くて もす む と い う好
つ い て い たbinaryを
しに 匪 コ ンパ イル され たsendmanに
UNIX
そ の ま ま 使 っ て い る 場 合 の み。
は こ の 手は 通 用 しな い。
MAGAZINE
1989.1
■lnternetのworm騒
動
しなか っ た。ま た、感 染 もす べ て のUNIX、あ
べ て の4BSD系
VAXとSun
のUNIXに
3の み で あ る。 Wormの
VAX用
の もの とSun用
る いは す
及 ん だ わ け で は な い。
プ ロ グ ラム は
の もの しか 用 意 され て お らず、
その 他の マ シ ンで は、listenerプ ロ グ ラム は潜 人 で きて も
その マ シ ンで 実 行 で き るwormは
は 存 在 し な い。1つ1つ
のwormに
考 え な け れ ば な ら な い。こ
ろ で は あ る。RTM's
対 し て個 々 に 対 策 を
の あ た りが 防 御 側 の 弱 い と こ
wormの
場 合 は、感
3つ の 方 法 が 用 い られ て い る。し
染 に は上 記の
た が っ て、そ
の いず れ
の 方 法 で も感 染 さ れ な い よ う に し て お け ば よ い。
転 送 され て こ な い の
Worm騒
ぎ の 直 後 よ り、 U.C.Berkeleyか
らsend-
で、そ れ以 上 周 囲へ の 感 染 を広 げ る こ とは な か った。し
mailヘ
パ ッ チ を 当 て る 方 法 がcomp.bugs。4bsd.ucb一
か し、VAXとSun
飯esと
し て 投 稿'さ れ て い る。こ
3と い うlnternetで
もっ と も多 く
使 わ れ て い る もの だ け に、感 染 した 計算 機 数 は6,000台
列 をshowqと
に達 した といわ れ て い る。
で、ソ
RTM's
wormは、感
染 の 事 実 を極 力 察 知 され ない よ
う に 種 々の 工 夫 を して い た。た
wormプ
と え ば、転 送 さ れ た
ロ グ ラム は、自 分 自身や ほ か の フ ァイル をい っ
た んopenOし
た あ とす みや か にunlinkOを
バ グ に 対 し て も、getSの
3番
投 稿 さ れ て い る。
目の"パ
ス ワ ー ド破 り"は、前2者
な る。sendm甜
存 在 す る 穴 で あ り、管
フ ァイル・シ ス テ ムの 特 徴 に よっ
openし
し か し、不
やfingerdを
利 用 す る 方 法 は、シ
ユ ー ザ ー に 注 意 を促 す し か な い。
も う1つ。RTM's
wormは
悪 用 し な か っ た が、
に も た ち の 悪 い 虫 が 潜 ん で い る。そ
フ ァイル をopenし
ftpを サ ー ブ し て い る 場 合、簡 単 にroOtの
て い るす べ て の プ ロセ ス か らclose
また、wormは
自分 のargv[0]を"sh"に
し ま う、と
書 き換 え て し
ま う。す る と、ps axな どでプ ロ セ ス を調 べ て も、あ た か
ftpdの
ステムに
理 者 側 で 対 策 を と る こ と が で き る。
適 切 な パ ス ワ ー ド設 定 は 管 理 者 の 権 限 を こ え
た 問 題 で あ り、各
て い るプ ロ セ ス が 存 在 す るあ い だ は フ ァイル の
とは性 質 が 異
実体 は存 在 し、普 通 に ア クセ ス す る こ とがで きる。そ の
され た と きに は じめ て 消 去 され る。
代 わ り にfgetS
を 使 う よ う に 修 正 さ れ た プ ロ グ ラ ム がcomp.bugs.
4bsd.ucb-fixesに
実 行 す る。
れ たフ ァ イル で も、そ の フ ァ イル を
い う文 字
ー ス コ ー ドが な くて もパ ッ チ を 当 て る こ と が で き
る。ま た、血ngerdの
消去 され るの で、lsで 見 て もそ の 存在 を 知 られ るこ とは
ない。し か しUNIXの
debugと
い う文 字 列 に 変 更 して し ま う とい う もの
この よ うにす る と、デ ィレ ク ト リか らは その フ ァ イル は
て、た とえunlinkさ
れ は、
い う も の で あ る。こ
ソ ー ス・プ
ftpd
れ は、anonymous
権 限 が 得 られ て
れ に 対 す る対 策 を 施 した
ロ グ ラ ム がcomp.bugs.4bsd.ucb岨xes
に 投 稿 さ れ て い る の で、パ
ッチ を 当 て る 必 要 が あ る。
もshが 走 っ て い る か の よ う に見 え て し まい、 wormが
走 っ てい る こ とに気 づ か れ に くい3。
Wormの
さ いわ い に も、RTM's
活 動 が 発覚 したの は、ひ とえ に計 算機 をあ ま
wormは
日本 に は伝 搬 して こ
な か っ た。し か しなが ら、い つ 次 な るworm/virusが
りに も重 くし、あ るい は仮 想空 間や プ ロセ ス・テ ー フヲレ
Internetに 襲 来 しな い と もか ぎ らな い。あ るい は、 Inter-
を喰 い尽 くして しま った こ とに よる。周 囲 の ほ とん どす
netだ けで は な くmmdfやuucpを
べ ての 計 算機 の レスポ ンス が極 端 に悪 くな っ た り、ク ラ
うな、よ
ッシ ュ した りす れ ば、当 然、し
あ る。そ の た め、管 理 者 の み な らず、一 般 ユ ーザ ー や メ
か るべ き管 理 者 に よっ て
り"強 力"なworm/virusが
も感 染 媒 体 とす る よ
出現 す る可 能 性 も
感 染 した計
ー カ ー、ベ ンダ ー が相 互 に協 力 し、対 応 で きる体 制 作 り
算機 で も・再び カモ に して しま う"と い う方 針 を とっ て い
が 必 要 で あ る。ま たプ ロ グ ラム の作 成 時 に も、そ の よ う
た こ とに起 因 して い る。感 染 に よ って 免疫 を作 る よう な
に悪 用 され か ね な い機 能、た とえばgetSやpopenな
機 構 が 用 意 され て いれ ば、計 算 機 の 負荷 を極 端 に重 くす
使 用 す る場 合 に は 充分 注 意 す るこ とが 大 切 に な って きて
る こ とは な か っ た し、そ うす れ ば、か な りの あ いだ、密
い る。
原 因 が 調査 され る。こ れ は、wormが"1度
か に棲 息 して い た に違 い ない。
今 回 のwormが、ネ
どを
ッ トワー ク の黎 明 期 に あ る 日本 で
の 広域 ネ ッ トワ ー クの 発 展 に悪 影 響 を残 さな い こ と を祈
感染防止法
って や まな い。
(か と う・あ き ら
さて、virusやwormの
3p5
らな いが、生 物 に対 す るvirusと
UNIX
MAGAZINE
東 京 工業 大 学)
感 染 防 止 策 を考 え な けれ ば な
l989.1
uaxで/bin/5hと
は 大 き さが 違 う なん て 汁通 は気 づ か な い。
同 様 に万 能 のvaccine
71
NETWORK
TECHNOLOGY
11
播 口陽一
最 近 の経 路 検 索 技 術
修正2進 木/B木
ネ ットワー ク機 器 で は、近
年IP(IIlterllet Protoco1)に
お け る高 速 経 路 検 索 へ の 関 心 が 非 常 に 高 まって い ます。
これ は物 理 層 の 帯 域 の 増 大 が1つ の 要 因 です。経
路検
索 に 関 す る新 しい ア ル ゴ リズ ムや 経 路 検 索 専 用 のLSIな
に よる経 路 検索
2か ら分 か るように、next
信 す る 機 器 と直 接 接 続 され て いる 必 要 が あ ります。IPデ
ー タグ ラム はnext hol)か らnext hopへ と転 送 され 、最
終 的 に宛 先 に 届 け られ ます。
ども発 表 され て い ます。
今 回 は、予
IPア ドレス は32ビ ットで す か ら、 IPア ドレス として とりう
定 を変 更 して 最 近 の 高 速 経 路 検 索 技 術 に
る値 の 数 は232=4Gに
hOp)を
経路検 索の仕 組み
経 路 検 索 技 術 の 詳 細 に 入 る前 に、IPデ
ー タグ ラム転 送
とえ で きた として
まとめ、経
ー タ(や ホ ス
ト)は パ ケ ットを転 送 あ るい は送 信 す る際、パ
ケ ットご とに
索 キ ー には パ ケ ットに含 まれ る宛
先IPア ドレスを 用 い、検
索 結 果 として、そ
に処 理 す る 機 器 のIPア
ドレス を得 ます(図2)。そ
ドレス を1つ の"ネ
ットワー ク"と して
路 の 検 索 を 個 別 の 宛 先IPア
ドレス で は な く宛
先 ネ ットワー クに 対 して お こな うように な って い ます1。
これ に より経 路 表 の サ イズを小 さ くす るこ とが で きます。
ス トもル ー タも)経 路
表 とい わ れ る 表 をもって い ます(図1)。ル
ケ ットを 次 に 処 理 す る機 器 はnext
そ れ に 対 す る11ext
も現 実 的 な時 間 で 経 路 表 を更 新 す るの は不 可 能 で す。IP
の 仕 組 み に つ い て 簡 単 に 復 習 してお きましょう。
IPを 用 い るす べ て の 機 器 は(ホ
た が って 経 路 表 に す
ドレス(と
登 録 す るの は不 可 能 で す し、た
で は 連 続 す るIPア
図1経
な ります。し
べ て の と りうる宛 先IPア
つ い て 解 説 します。
経 路 表 を検 索 します。検
hopと なる機 器 は パ ケ ットを送
現 在 のIPで は ネットワー ク・ア ドレスを 以 下 の ように 表 しま
す。
<IPprefix>/<prefix
length>
の パ ケ ットを 次
のパ
hopと 呼 ば れ ます。図
ユ
宛 先IPア
ド レ ス ご と に11cxt
う な 経 路 を ホ ス ト経 路(host
hOl)を 指 定 す る こ とも で き ま す。こ の よ
route)と
い い ます。
路表
経 路 制 御 プ ロ ト=]ル
(RIP、
入 力デ ータグラ ム
OSPF、
BGP4ほ
か)
↓
経路検索
ヘ ッダ処 理
細分化
エ ラー処 理
ほか
…
L一_一
64
↓
一 一 塑__一__一
ー
宛先IPア
ドレス
経 路表
一
nexthopのIPアドレス
出力ポー ト
一 一 一 一 一 一 一__一__」
UNIX
MAGAZINE
1998,10
N正TWORK
図2
TECHNOLOGY
11
1Pデ ー タ グ ラ ム の 転 送
ホ ス ト2
net1
net2
R1
net3
R2
net4
ホ ス ト1
net5
R3
R1の
R2の 経 路 表
経 路 表
next hOP
R3の
経 路 表
next hOP
宛 先
next hOP
netl
netl
R1
netl
Rl
net2
net2
nel2
Rl
net3
net3
net3
R1
net4
net4
2
R
R
宛先
宛 先
net4
R
3
R
net5
net5
net5
ホ ス ト1が ホ ス ト2宛 に デ ー タ ク ラ ム を送 信 し た場 合
1.R1は
ホ ス ト2のIPア
2.R1は
3.R1は
経 路 表 の 検 索 に よ り、ホ ス ト2がnet3に 属 す る こ と を知 り、R2をnext
デ ー タ グ ラ ム をR2に 送 信 す る。
ドレ ス を検 索 キ ー と して 経 路 表 を検 索 す る。
4,R2は
ホ ス ト2のIPア
hopと
し て 返 す。
ドレ ス を検 索 キ ー と して 経 路 表 を検 索 す る。
5.R2は 経 路 表 の 検 索 に よ り、ホ ス ト2がnet3に 属 す る こ と を知 る。
6.net3は 直 接 経 路 な の で、 R2は ホ ス ト2に 直 接 デ ー タ グ ラ ム を送 信 す る。
IP
prefixは、宛
来 は 宛 先IPア
(Classless
先 ネ ットワ ー ク のIPア
ド レ ス と 呼 ば れ て い ま し た が、
Illter-Domaill
Routing)導
とい う関 係 が な りた ち ま すCは1の
ドレ ス で す。従
し ま す)。た
CIDR
入 後 はIP
prefixと
prefix
Iengthに
prefixの
は、
位16ビ
IP prefixの
と え ばprefix
上 位16ビ
で あ り、下
255.255.255,0に、prefix
255,255.0,0に
呼 ば れ る こ と が 多 い よ うで す。
を 指 定 し ま す。た
と え ば、prefix
ネ ットワ ー ク部 の 長 さ
lellgtllが16の
ッ トが ネ ッ トワ ー ク・ア
場 合、
IP
ドレ ス とし て 有 効
ッ トが 各 ホ ス トの 識 別 に 使 用 さ れ る こ と
に な りま す。
た と え ば10.1.1.0/24と
い うIP(ネ
ッ トワ ー ク)ア
ドレ ス
24は
ネ ッ トマ ス ク
lellgth
l6は
ネ ッ トマ ス ク
対 応 し ます。
経 路 検 索 は ネ ットワ ー ク 部 に 対 し て の み 適 用 され ます。
一ヒ記 の 例 で は、宛
の256種
類 のIPア
10.1.1.0./24へ
先IPア
256に
ドレ ス が10.1.1.0∼10.1.1.255
ドレ ス は す べ て 同 じ 宛 先 ネ ットワ ー ク
の デ ー タ グ ラ ム と み な さ れ ま す。す
経 路 表 に 登 録 す るIPア
は、
補 数 を とる こ とを 示
length
ドレ ス の 数 が256か
ら1へ
な わ ち、
と、1/
圧 縮 さ れ た こ と に な ります。
こ こ で 問 題 に な る の は、
●上 位24ビ
ットが ネットワー ク部
1.prefix
●下 位8ビ ットが ホ ス ト部
とい うこ と に な りま す。prefix
2.IPデ
lengthは
た ネ ッ トマ ス ク に 対 応 し て い ま す。ネ
lengthの
従 来 用 い られ て い
ットマ ス ク とprefix
lellgthは
可 変長 である
ー タ グ ラ ム に は、宛
先 ネ ッ1・ワ ー ク のprefix
lellgth
の 情 報 は 含 まれ ない
とい うことで す。た
とえ ば、経
路 表 に、
あ い だ に は、
netl:10.1.1.0/24
ネ
ッ ト マ
UNIX
ス
ク='(2(32Tp「efix
MAGAZINE
lel'9t1')一1)
l998.10
65
N正TWORK
T正CHNOLOGY
net2:10.1.0.0/16
最 長 一 致 則 を満 たす ように経 路 を検 索 す るア ルゴ リズム
とい う2種 類 の 宛 先 ネットワ ー クが あ る、宛
として10.1.1.1を
11
先IPア
ドレス
もつ デ ー タグ ラムを受 信 した 場 合 を考 え
て み まし ょう。
として、4.3BSDま
で は ハ ッシュ表 による経 路 検 索 ア ル ゴリ
ズム が 用 い られ て い ました。し
り速 くな い た め、4.4BSDで
Treeと
い う経 路 検 索 ア ル ゴ リズム が 用 い られ て い ます。
net1:10.ttO&255.255.255.0==10.1.1.1&255.255.255.O
前 者 は 本 誌1997年3月
net2:10.1.0.0&255.255.0.0
NOteS」に、後
==10,1.1,1&255.255.0.0
か しこれ は検 索 速 度 が あ ま
は 検 索 速 度 を 改 善 したRadix
号 の「UNIX
者 は1997年3月
Commullication
号 と4月 号 の 同 連 載 に 解
説 が あ ります。
11et1、 net2の 両 方 とも検 索 に成 功 します。こ
の ように
しか しRadix
Treeは どち らか とい うとホ ス ト向 け の ア ル
宛 先IPア ドレス に対 して 複 数 の 宛 先 ネ ットワ ー クが あ る場
ゴ リズ ム で あ り、検 索 速 度 を最 適 化 す るとい うよ りは、ほ
合、「prefix
どほ どの 検 索 速 度 で メモ リの 効 率 的 な使 用 を重 視 して い る
lellgthが もっ とも大 きな 宛 先 を選 択 す る」と
い う規 則 に な って い ます。こ
match
rule)と い い ます。こ
れ を最 長 一 致 則(longest
感 が あ ります。ま
の 例 で はnetlが 最 長 一 致 則
に よって 選 択 さ れ る ことに な ります。
以 上 を まとめ ると、IPに
trackingが
たRadix
Treeで
くす る 要 因 に なって い ます。一.一方、近
お け る経 路 検 索 の 仕 組 み は以
下 の ように な ります。
OC-48は2Gbpsと、
●prefix
lellgth
●next
hopのIPア
た とえ ば、帯
域 が1Gbpsの
帯 域 は10Gbpsで
す。
伝 送 路 か らの64オ クテ ット/
フレー ムの 連 続 入 力 をフレー ム の廃 棄 な しに 処 理 す る場 合
ドレ ス
を考 えます。IGbpsと
2.ル ー タは 受 信 したIPデ ー タグ ラムご とに、デ
ー タグラ ム
に 含 まれ る宛 先IPア ドレス を検 索 キ ー として 経 路 表 を検
索 し、検
とえ ば
IGbps
以 上 の 帯 域 を もっ てい ます し、来 年(あ るい は 再 来 年)に
実 用 化 が 予 定 され て い るOC-192の
prefix
年 の物 理 層の帯 域
の 増 大 は より高 速 な経 路 検 索 を要 求 してい ます。た
Giga1〕it EthernetはlGbps、
1.経 路 表 に は す くな くとも以 下 の3つ の 要 素 が 含 まれ る。
●宛 先IP
は経 路 検 索 時 にback
発 生 す る可 能 性 が あ り、こ れ も検 索 時 間 を長
索 結 果 として11ext hopのIPア
要 な 時 間 は、
1/109=lIls/ビ
ット
ドレス を得 る。
3.宛 先IPア ドレス に 対 して 複 数 の 宛 先 が あ る場 合 はprefix lellgthが 最 大 の もの を選 択 す る(最
い うことは1ビ ットを転 送 す る の に 必
で す。64オ
クテ ットは512ビ ットで す か ら、64オ
クテ ットの
フレー ム を受 信 す る の に は51211sか か ります。し
長 一・致則)。
たがって
フレー ムの 廃 棄 を発 生 させ な い ように フ レー ム を転 送 す る
経 路 検 索 と一 般 の検 索
た め に は、ル
ー タは51211s以 内 に す べ て の 処 理 を終 える
必 要 が あ ります2。
一 般 の 検 索 で は、複
また、ル
数 の候 補 の なか か ら検 索 キ ー 全 体
が 一 致 す る もの を選 択 します。キ
ーの 一部 が一 致 するも
の を検 索 す る場 合 で も、キ ー の ど の 部 分 を検 索 す る か は
通 常 あ らか じめ 分 か って います。こ
の ような場 合 の検 索 技
術 に 関 して は す で に さまざ まなア ル ゴ リズ ムが 開 発 され、
1,TTL
2.チ
ー タは 経 路 検 索 以 外 に も、
decrement
ェ ッ クサ ム 再 計 算
3,1、2に
お け るエ ラー 処 理
4。フ ィル タ リ ン グ
教 科 書 に も多 くの ア ル ゴ リズム が 記 載 され て い ます。
一 方、経
lengthの
路 検 索 の 場 合、経
路 表 の 各 要 素 はprefix
情 報 をもって い ます が、 IPヘ
ッダ に はprefix
lengthの 情 報 は い っ さい 含 まれ て い ませ ん。ま
た、単
純
さらに最 近
とい っ た 処 理 をお こなわ な け れ ば な りませ ん。
で は これ らに 加 え て、
5.デ
ー タ グ ラ ム のclassificatio11
に 一 致 を検 索 す るの で はな く、最 長 一 致 則 を満 たす ような
宛 先 を検 索 す る 必 要 が あ ります。し
た が って、通
常 の検
索 アル ゴ リズム を そ の まま適 用 す る ことは で きませ ん。
66
2
Ethernetの
場 合 に はpreanlble(8オ
ク テ ット)とinter
fralne
gap
(12オ ク テ ット)の オ ー バ ー ヘ ッドが あ る の で、す べ て の 処 理 を 終 え る
た め に 与 え られ たll寺聞 は67211sで
UNIX
す。
MAGAZINE
1998.10
N正TWORK
6,複 数 の待 ち 行 列(queue)の
T正CHNOLOGY
11
一 クで は 、あ る宛 先 へ の 転 送 が 発 生 した場 合、同
管理
じ宛 先
へ の 転 送 が しば らく継 続 す ること、言 い 換 えれ ば 高 い キャ
とい ったQoS(Quality
of Service)に
関 す る 処 理 も必 要
で す。1∼3は
比 較 的 簡 単 な処 理 で す が、4∼6は
り複 穀 で す。し
た が って512nsの 全 体 が 経 路 検 索 に 使 用
で きるわ け で は あ りませ ん。お
る時 間 は512nsの
そ らく、経 路 検 索 に 許 され
半 分 の25611s以
AscelxlのGRFはRadix
下 で しょう。
ッシュ ヒット率 が 続 くことが 期 待 で きます。
しか しなが ら、イ ンター ネ ットの バ ックボ ー ンに 利 用 され
るような コアル ー タ(core
router)の 場 合、多
路 の 検 索 に は 平 均 で1μs、最
か って しまい ます[3]。
くの 発 信 元
か らの デ ー タグラム が 混 合 され て ル ー タに 流 入 す るた め に
上 記 の 仮 定 は な りた ち ませ ん。ま
Treeを ハ ー ドウ ェア化 し た経
路 表 をもって い ます が、経
悪 の 場 合3μsか
かな
種 類 も莫 大 にな る た め、通
先IPア
ドレス 未 満)で
た、宛
先IPア
ドレス の
常 の キ ャッシュサ イズ(64K宛
は 経 路 キ ャッシ ュが ス ラッシ ング
(thrashing)を 起 こ して しまい、キ
ャッシュが 有 効 に 働 きま
せ ん。
経 路 キ ャ ッ シ ュ(route
cache)
と そ の 限 界
くに インター ネ ットの バ ックボ ー ンに 利 用 さ
路 キ ャッシュを 高 速 化 す る よ
りも経 路 検 索 を 高 速 化 す る の が 主 流 に な りつ つ あ ります。
ここ まで述 べ た ように、Radix
Treeを
川 い て も最 長 一
致 を求 め る経 路 検 索 に は 時 間 が か か ります。こ
れ を解 決
す るた め に 考 え られ た 方 法 の1つ に 経 路 キ ャッシュ が あ り
ます。経
こ の た め、と
れ るようなコアル ー タで は、経
路 キ ャッシュは 一 種 の ホス ト経 路 表 で、ル
よって 経 路 エ ントリが 自動 的 に登 録、削
の ホ ス ト経 路 表 と異 な ります。経
除 され る 点 が 通 常
路 キ ャッシュ の 実 装 とし
て は ハ ッシュ 表 が 多 く用 い られ て い ます。ハ
キ ー に は32ビ ットのIPア
ー タに
ッシュ関 数 の
ド1/ス全 体 が 用 い られ ます。以
下 に 経 路 キ ャ ッシュ を用 い た 経 路 検 索 の 手 順 を示 します
また、経
路 キ ャッシュに は 前 述 の ように そ の 内 容 と経 路
表 の 内容 とをつ ね に 同期 して おか な けれ ば ならない 問 題 が
あ ります。す
な わ ち、経
路 キ ャッシュを もつ ル ー タで は経
路 キ ャッシュと経 路 表 の 内容 の 不 一 致 が 原 因 で 通 信 で きな
い とい った 問 題 が 発 生 す る可 能 性 もあ ります。
この た め、Gigabit
Ethenletル
ー タの な か に は、経
路
キ ャッシュをもた ず に経 路 検 索 を 高 速 化 して い るもの もあ り
ます。た
とえ ばBay
NetworksのAccelarは
経 路 キ ャッ
シュ をもってい ませ ん。
以 上 の ような 理 由 に より、性 能 の よい 経 路 検 索 ア ルゴ リ
(ハ ッシュ表 の コ リジ ョン処 理 は 省 略 して い ます)。
ズム とそ のハ ー ドウ ェア化 の 研 究 が 近 年 さか ん に お こなわ
h=hash(宛
先[Pア
if(経
next
れ て い ます。
ドレ ス)
路 キ ャ ッ シ ュ[h]に 有 効 な エ ン トリ が 存 在){
-hop=経
今 回 は そ の な か で、2進
路 キ ャ ッ シ ュ[hユ.nexLhop
木 を改 良 し た もの を 紹 介 し ま
す。
}else{
next
検 索
-hop=lookupJoute-tabie(宛
先1Pア
ド レ ス)/★
経 路 表
★/
修 正2進 木1B木 ア ル ゴ リズ ム
経 路 キ ャ ッシ ュ[hl.nextjop=nexLhop;
こ の ア ル ゴ リズ ム はB.Lampsoll、
}
Vargheseに
経 路 キ ャッシュが ヒットして い るか ぎり、経 路 検 索 の 計
算 量 は0(1)で あ ることが 分 か ります。な
新 され た 場 合 に は、そ
お、経
路 表が 更
れ ぞ れ 関 連 す るエ ントリを経 路 キ ャ
ッシュか ら削 除 す る必 要 が あ ります。し
か しな が ら、関 連
よ っ て1997年
V, Srillivasan、
G.
に 提 案 さ れ ま し た[21。
原理
彼 らの 基 本 的 な方 針 はIP prefixを あ る範 囲 として2分
探 索 表 に す る ことで す。た
とえ ば、
す るエ ン トリをみ つ ける た め の 計 算 が 複 雑 に な ります。こ
の た め 経 路 キ ャ ッシュ全 体 をク リア して し まう機 器 も多 い よ
net1:10.0.0.0/8
うで す。
net2:10.4.0.0/14
経 路 キ ャッシ ュは この ように 高 い キ ャッシュヒ ット率 が 期
待 で きる場 合 に は 非 常 に有 効 で す。ま
UNIX
MAGAZINE
l998.10
net3:10.4.1.0/24
た 小 規 模 なネ ットワ
67
NFTWORK
図32進
TECHNOLOGY
11
木 ア ルゴリズム
(1)
圓
(2)
匝](L)
、・[画
(L)
ド
1
・」
10410
(L)
1041255
(H)
.1
10.4.5.60
し払
107255255
10.7.255.255
(H)
10.8.9.10
hO.255.255,2551
[0.255.255,2551㈹
図4
2分 探 索表
場 合 に もそ の エ ントリが 表 す ネ ットワ ー クが 宛 先 ネ ットワー
prefix
length
flag
L
12
10.4.tO
24
L
8
10.4.α0
L
10.0.0.0
方"H"属
24
H
14
H
8
H
10.7.255.255
索
検 索 が 失 敗 した場 合 に はそ の エ ントリが 表 す ネットワー クよ
りももう1段 広 い 範 囲 を もつ ネ ットワー クが 宛 先 ネ ットワー ク
10.4.1.0
10,4」.0
10.4.0.0
10.4.1.0
10.0.0.0
10.4.0.0
lP prefixが
10.0.0.0
な る 宛 先 ネ ッ トワ ー ク
同 一 でprefix
経 路 表 に はprefixが
とい う3つ の 宛 先 が あ る場 合、図3-1の
を 作 成 し ます。す
性 を もつ エ ントリで は、検
が 成 功 した 場 合 に は そ の エ ントリが 表 す ネットワー クが、
とな ります。
10,4.1.255
10.255.255255
奮蕊「
クとな ります。一
ような2分 探 索 表
先 ネ ットワ ー ク、た
同 一 でprefix
lengthが
lengthが
異
異 な る宛
と え ば、
な わち 各 宛 先 ネットワ ー クは、
net1:10.0.0.0/8
net1:10.0.0.0/8は10.0.0.0∼10.255.255.255
net2:10.0.0.0/16
net2:10.4.0.0114は10.4.0.0∼10.7.255.255
とい うネ ットワー クが 登 録 され る場 合 が あ ります。こ
net3:10.4,1.0/24は10.4」.0∼10.4.1.255
とい う範 囲 をもつ として2分 探 索 表 を作 成 します。こ
のよ
うな経 路 表 を用 い る と、た とえば1α4.5.60、10.8.9.10と い
うIPア ドレス を検 索 した場 合、こ
経路 表 を新 たに構 成 す る場 合、も っとも単 純 な方法 は
宛 先 範 囲 の 最 初 を、"H"(High)は
宛
先 範 囲 の 終 りを そ れ ぞ れ 示 します。
2分 探 索 が 失 敗 して 終 了 す る場 合、検
終 エ ントリよりも大 きな値 に な ります。し
68
以 下 のとお りです。
1.経 路 制 御 プ ログ ラム か ら得 た す べ て の 経 路 に対 し て宛
これ を実 際 の2分 探 索 表 に した もの を 図4に 示 し ます。
性 をもつ エ ントリで は、検
経路 の更新
れ らのIPア ドレス に 対 し
て 正 しい 経 路 を与 え られ ることが 分 か ります(図3-2)。図
中 で"L"(Low)は
の よう
な 場 合 に もこ の ア ル ゴ リズ ム は有 効 です(図5)。
索 キ ー は つ ね に最
た が っ て"L"属
索 が 成 功 した場 合 に も失 敗 した
先 範 囲 を 示 す エ ン トリを作 成 し、"L"お
よび"H"の
flagを 設 定 す る。
2.経 路 をIP prefix(宛
先 ネ ットワー ク)を キ ー にして 並
べ 替 える。
UNIX
MAGAZINE
l998.10
NETWORKT正CHNOLOGY
図5
1Pprefixが
同 一 でprefix
lengthが
11
異 な る 宛 先 ネ ッ トワ ー ク
..[亟](L)
ゴll・
prefix
Iength
・1・g鵜
10.0.0.0
16
L
net2
net2
10.0.255.255
16
H
neU
net2
8
H
.α255劉(H)1・.255.255.255
ぎ ン トリ
鵜 ぎ ン トリ
net1
110.255,255.2551(H)
図6
経 路 登録 とスタック
キ ー〉エ ン トリflag
キ ー=エ ン トリ
の場 合
の場 合
1。.。.。、。/8
(L)
1。.。.。.・
1。.Q.。.。
10.4.0.0/14
(L)
10.4.0.0
10.4.0.0
スタ ッ ク
巨画
10
00
10
00
10
10.4.1.0/24
(L)
10.4.1,0
10,4」.0
10.4.1.255124
(H)
10.4.0.0
10,4.1.0
経 路登 録 の順 序
. .、
'
し
ー
Il
0
10
00
10
00
10
00
10
00
10
30
10
00
悪0
00
10
00
10
00
「
1
で0.4.3.0124
(L)
10,4.3.0
10,4.3.0
10,4.3.255124
(H)
10.4,0,0
10.43.0
「
…
唱
10,7.255,255/14
(H}
10.0,0.0
10,4.0.0
10.255,255,255〆8
(H>
,
10,0,0.0
圃
旨
3,ス タックを用 意 し、経 路 表 を上 か ら順 に走 査 す る。そ
際、経
路 エ ントリに"L"nagが
エ ントリのIP pre倣(正
立 ってい る場 合、そ
の
の
確 に は そ のIP pre飯 へ の 経 路
情 報 へ の ポ インタ)を ス タックにプ ッシュす るとともに、そ
のIP
pre丘xを 経 路 表 の"〉"お
に 登 録 す る。経
合、ス
よび"="フ
路 エ ントリに"H"刊agが
ィール ド
立 ってい る場
タックか らIP pre倣 をポ ップ し、そ れ を経 路 表 の
"="フ ィー ル ドに 登 録 す る。さ らに もう一 度 ポ ップし、そ
の 結 果 を経 路 表 の"〉"フ
UNIX
MAGAZINE
ィー ル ドに登 録 した あ と、そ
1998,10
1
れ を スタックにプ ッシュす る(ス
タックに戻 す)。
経 路 登 録 とス タックの 関 係 を 図6に 示 し ます。な
の ア ル ゴ リズ ムの 計 算 量 は0(N)(Nは
お、こ
経 路 数)に
な りま
す。
す で に存 在 す る経 路 表 に新 た な経 路 を挿 入 す る場 合、
2分 探 索 表 で は表 中 の エ ン トリを シフ トす る 必 要 が あ り効
率 が よくあ りませ ん。こ
こまで の 説 明 は 単 純 化 の た め 経 路
表 を2分 探 索 表 として 説 明 して きました が、2分
探索 表 を
69
陶
NETWOR.KT正CHNOLOGY
図7
2分 探索 の2進 木 表 記
図9
lPア
11
経路 表 の 分割
五=ユ[=ユ[コ
ドレス
0 1
● ■ ●
η
● ● ●
図8
ト
たちオ
に対 す る
2進 木 の経 路 挿入
経 路表
255
(1)
(2)
neU〔L}
分割表
net1〔 し}
ρ
畠りne虻2〔 し}
ロロ
ヒ
「「[
ヒ
[ [
・・伸・凸・・…
経路表 の分 割
全 経 路 を1個 の2進 木 に 登 録 した場 合、経
ー
〔
くなるに つ れ て 木 も大 きくな り、検 索 時 の メモ リア クセ ス の
1
回 数 も増 大 して しまい ます。こ
[1
●
●
●
o
●
●
[1
れ を 防 ぐた め の もっ とも単
純 な 方 法 は 経 路 表 を複 数 の2進 木 に 分 割 し、そ れ ぞ れ の
1
[1
11et2㈹
l
I
木 の 大 きさを小 さ くす る ことで す(図9)。
図9で は、IPア
に用 い て い ます。こ
ドレス の 最 上 位8ビ ットを2進 木 の 分 割
れ に より、1個
の2進 木 を256佃 の2
進 木 に分 割 す ることが で きます。検
net1{H)
net1㈹
路数が大き
1
索 は以 下 の ように お こ
ない ます。
2進 木 として 実 装 す るこ とに より経 路 挿 入 時 の エ ントリの シ
フ トをな くす ことが で きます。2進
木 は 昇 順 もし くは 降 順 に
並 べ た デ ー タを そ の まま配 列 の か た ちで は な く木 構 造 に し
て もつ ように した もの で す。検
た め、2分
索 表 が 木構 造 に なって い る
探 索 表 の ようにエ ントリを 挿 入 す る際 に エ ントリ
の シフ トを す る必 要 は あ りませ ん。図7は、図4の2分
探
索 表 を2進 木 として 表 した もの です。
しい 経 路 を挿 入 す る場 合 の 計 算
量 を0(N)よ り小 さ くす る ことは で きませ ん。図8に
な例 を示 します。こ
い ます。図
こで はnetlの 直 後 にnet2を 挿 入 して
か らも分 か る ようにnetlに
prefixの"H"属
な って い ます。こ
ようにnet2を 挿 入 した 場 合、こ
70
内 包 され る各IP
性 を もつ エ ントリの"〉"フ
挿 入 前(図8-1)はnetlに
べ てnet2に
典型的
ィー ル ドは、
こに 図8-2の
れ らの エ ントリの 内 容 はす
変 更 す る必 要 が あ ります。
ドレス の 最 上 位8ビ ットを取 り川 す。
進 木 の 根 の ポ インタを得 る。
3.2進 木 を検 索 す る。
分 割 表 の サ イズ が 大 きい ほ ど、2進
ます。オ
リジ ナ ル の 論 文 で は、IPア
ットを2進
2進 木 の 導 入 に より経 路 挿 入 時 の エ ントリの シフトはな く
す ことが で きます が、新
1.宛 先IPア
2.そ の8ビ ットをilldexと して 分 割 表 を検 索 し、目 的 の2
ドレス の 最 上 位16ビ
木 の 分 割 に 用 い て い ます。し
prefix lengthが8∼16の
か しこ の 場 合、
経 路 に 対 し て分 割 表 で の 管 理
が 複 雑 に な って し まい ます。こ
位8ビ
木 の 深 さは浅 くな り
こで は 単 純 化 の た め 最 上
ットだ け を用 い ました。IPで
未 満 の 経 路 は あ りませ ん の で、最
はprefix
lellgthが8
上 位8ビ ットだ け を用 い
ると分 割 表 の 管 理 は 単 純 に な ります。そ
の 代 わ り各2進
木 の 深 さは 深 くなっ て しまい ます。
B木 の 採用
い ままでの 説 明 では経路 表 の実 装として2進 木(2分
UNIX
MAGAZINE
1998.10
NETWORKT正CHNOLOGY
表1
11
各ア ルゴ リズムの 経 路検 索 時 間(ns)
Radix
16bitラ}害U表+
6way
B木
1,175
730
490
L525
990
620
490
1,450
1,140
470
390
2,585
1,210
400
300
1,980
1,440
330
210
810
1,220
90
95
1,170
1,310
90
90
1,530
図10
16bit分 割 表+
2分 検 索
単 純2分 検 索
Tree
B木 による経路 表
行 は 木 の もっとも浅 い ところに あ る宛 先 を検 索 した 場 合 の
k3
結 果 です。
k6
今 回 は 修 正2進
ノ ー ドポ イ ン タ
た。次
木 に よる経 路 検 索 に つ い て 解 説 しまし
回 は、さ らに 高 速 な経 路 検 索 技 術 に つ い て 説 明 し
ます。
kl
k2
k4
k5
k7
、壽
∴、温、品
k6
(は りぐち・よ うい ち
田Douglas
E.
Comer,"Protocols,
亡er11θ亡worlfゴng
tice
か し、経
路 を範 囲 として 実 装
す るとい う同 じア イデ ア をB木 に 実 装 す る こともで きます。
B木 とは1つ の ノー ドか ら3つ 以 上 の ノー ドへ の ポ インタが
あ る木 で す(図10)。あ
Networks)
[参 考 文 献]
温、島、謡
探 索)を 用 い て きました。し
Mayan
るノー ドが 選 択 され た 場 合、そ
の
[21B.
Hall(邦
訳:「TCP/IPに
Lalnpso11,
ロps
V,
in
Architecture'1,乃
vo〃'Prf1ヱcψ1θs,
ユー
Pren-
よ る ネ ットワ ー ク 構 築 』)
Srinivasan
ロsf119'ハ ∬ し
互1亡fI弔
■ay
Appeared
and
wゴ 亡11 TCP/工P
and
aη(1
G, Varghese,工P
Loo1ζ 一
A∬u1亡fco1し11η11
INFOCOM「98,
Preprint
Searc11,
at:http://
www,ccrc.wustl.edu/『cheenu/papers/lnwmcbs.ps
【3】http://www.ascend.com/1680.html#3
ノー ド内 の どの ポ インタを次 に 選 択 す る か は2分 探 索 をお
こな って 決 め ます。
この 場 合、B木
訂正
の 各 ノー ドの サ イズ がCPUの
キャ ッシ
ュ ラインに 収 まるように ノー ドの デ ー タ構 造 を決 定 す るこ と
が 重 要 です。こ
先 月号 の22ペ ー ジ の コ ラム「MACア
左 段、下
れ に より、ノ ー ド内 の 検 索 で の メモ リアク
「IEEEが
セ ス は す べ て キ ャッシュへ の ア クセ スに な るか らで す。
割 り当 て るOUIは
て い ま す。global/10cal
★
このLampso11ら
うにback
ル ア ドレ ス)は
の ア ル ゴ リズ ムで はRadix
trackingが
Treeの
発 生 す るこ とは あ りませ ん。ま
よ
彼 らに よれ ば、こ
の ア ル ゴ リズム はPelltium
L2 cache)で
Pro(200
は最 悪 で も490nsで 検 索 が
終 了 す るそ うで す(経 路 表 の 大 きさが 約32,000経
合)。一
方、同
じ条 件 で のRadix
L53011sだ った そ うで す。表1に
索 時 間 の 比 較 を示 します。表
Treeの
MAGAZINE
あ る ア ドレ ス(ロ
なっ
ーカ
自 由 に 使 用 で き ま す」
とい う記 述 は、
路 の場
検 索 時 間は
各 アル ゴ リズム の 経 路 検
「IEEEが
割 り当 て るOUIは
て い ます。global/10cal
ル ア ドレス)は
す べ て この ビ ットが0に な っ
bitが1で
あ るア ドレス(ロ
ーカ
自 由 に使 用 で きます」
の 誤 りで した の で 訂 正 い た します。「lnterconnections』
の 原 書(26ペ
ー ジ)お
よび 邦 訳(25ペ
ー ジ)に も同 様
の 誤 りが 含 まれ て い ます。
の 一 番 上 の 行 は 木 の もっ と
も深 い とこ ろに あ る宛 先 を検 索 し た場 合、表
UNIX
す べ て こ の ビ ットが1に
bitが0で
た、
B木 の 導 入 と経 路 表 の 分 割 に より木 の 深 さも浅 くなります。
MHz、256KB
ドレス の 構 造」の
か ら5行 目、
1998,10
の 一番 下 の
71
連載
Perl 活用のヒント
15
今津英世
emailform
Web ページから HTML メールを送る
今月から何回かに分けて、HTML フォームから添付フ
図 1 form.cgi の画面
ァイル付き HTML メールを SMTP で送信するプログラ
ム emailform をとりあげる。このプログラムは保存機能
を備え、送信したメールを後日参照することができる。
この連載でこれまでに紹介したプログラムはユーティリ
ティやモジュールばかりでアプリケーションをとりあげた
ことはなかったが、emailform はアプリケーションといえ
る。ただし、そのまま使うのではなく、HTML やメール
の処理例として参考にしたり、これをベースに実用的なア
プリケーションを作成してもらうといったことを想定して
いる。
Web やメール関連の処理をおこなうモジュールは数多
く作られており、emailform ではそれらを利用している。
したがって、ここでは既存のモジュールの使用法や具体的
な処理内容を中心に説明していく。
emailform は Perl 5.6/5.8 を対象としており、UNIX
CGI プログラムで構成されている。form.cgi は図 1 に示
環境(∗BSD や Linux、さらに Cygwin も含む)であれば
すような画面で、適宜記入して[送信]ボタンを押すと、あ
動作するはずである。動作確認は、Linux と Cygwin の
らかじめ設定されたメールアドレスに記入内容を送信する。
Apache HTTP サーバー上でおこなっている。
emailform が送信したメールをメール・ソフトウェアで見
この連載でとりあげるプログラムは原則として私が一か
ら書いたものであり、これまでに紹介したぶんも含めて以
下の URL で公開している。
• http://www.geocities.jp/himazu3/
プログラムの配布ファイルのなかには、日本語マニュア
ル(POD ファイル)が含まれている。
emailform の概要
emailform は、form.cgi と archive.cgi という 2 つの
UNIX MAGAZINE 2005.2
責了 [perl0502.ps]
ると図 2 のようになる。
archive.cgi を呼び出すと、これまでに form.cgi で送っ
たメールの一覧が表示される(図 3)
。ここで ``開く´´をク
リックすると、図 4 のように送信したメールを Web ペー
ジで読むことができる。
emailform の使用環境
emailform はファイアウォールの内側で使用すること
を前提にしている。これは、やろうと思えば Web ブラウ
ザから HTML ページのテンプレート・ファイルや保存さ
147
連載/Perl活用のヒント —
15
●
図 2 emailform が送信したメール
のない組織内部での使用を前提にしている。HTML メー
ルを読めない環境だったり、HTML をセキュリティ上好
まない人もいるので、不特定多数の相手に HTML のみの
メールを送るのは好ましいことではない。
使用モジュール
冒頭で述べたように、emailform は既存のモジュールを
使用している。そのなかには、IO::File や CGI などの基
本的なモジュールのほかにも、以下のモジュールがある。
• HTML::Template
テンプレートを使って HTML データを生成する。
• MIME::Entity
図 3 送ったメールの一覧
HTML メールの作成や、メールへのファイル添付の処
理をおこなう。
• MIME::Base64
メール内に任意のバイナリデータを含めるための Base
64 エンコーディングの処理をおこなう。
• Net::SMTP
SMTP でメールを送信する。
• Date::Format
日付や時刻の文字列を指定されたフォーマットに従って
図 4 送信したメールの表示
生成する。
• jcode.pl
日本語テキストデータの文字コードの変換をおこなう。
さらに、HTML::Template が使用するテンプレートを
生成するために、2004 年 3 月号で紹介した html2tmpl を
利用している。ただし、掲載時にはなかった機能を使って
いるので、Web ページから最新版を入手する必要がある。
Web サーバー
emailform は CGI プログラムとして動作するため、
れたメールのデータを覗けるなど、インターネット上で使
Web サーバーを用意する必要がある。CGI プログラムは
うには甘い点があるからである。
UNIX と Cygwin のどちらの Web サーバーでも問題な
メール・ソフトウェアから HTML メールを送信する場
く動作するだろう。ただし、emailform は cgi-bin 以外
合、通常はプレーンテキスト版と HTML 版の両方が 1 つ
のディレクトリで動かすことを前提にしているので、Web
のメールに含まれる。一方、emailform が送信するメール
サーバーの設定をそれに合わせる必要がある。Apache
は HTML 版だけで、プレーンテキスト版は含まれない。
HTTP サーバーであれば、httpd.conf 内の DocumentRoot の Options に ``ExecCGI´´を追加する方法がある。
この点でも、emailform は HTML のみのメールでも問題
148
責了 [perl0502.ps]
UNIX MAGAZINE 2005.2
連載/Perl活用のヒント —
15
●
DocumentRoot を/var/www/htdocs だと仮定すると、
httpd.conf の設定を以下のようにする(誌面の都合上、⇒
4. 以下のコマンドでサービスとして起動する。
cygrunsrv --start httpd
で折り返しています。以下同様)
。
なお、これは Cygwin のパッケージとして配布されてい
<Directory "/var/www/htdocs">
Options Indexes FollowSymLinks MultiViews ⇒
ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>
このほかにも、emailform を置くディレクトリの.htac-
cess で ExecCGI を有効にする方法がある。
Cygwin 上で使う場合の注意
Apache HTTP サーバーを Cygwin 上で使用する場
合、Windows のサービスとして動作させないと、email-
form が正しく機能しないことがある。私は Windows
XP (SP2) に Cygwin のパッケージの Cygwin 1.5.12-1
と Apache 1.3.29-1 をインストールしているが、すくな
くともこの環境ではうまくいかなかった。Windows のサ
ービスとして動作させなくても emailform が正しく機能
する場合もあるのだが、どのような条件でそうなるのかは
特定できていない。
Cygwin の Apache を Windows のサービスとして動
作させる手順は次のとおりである。
る Apache 1.3.29-1 の場合であり、他のバージョンでは
手順が異なるかもしれない。その場合は適宜/usr/share/
doc/Cygwin/apache∗ などを参照してほしい。
上記の手順では Apache を Windows のサービスとし
て動作させているが、そうしないとどういう不都合がある
かを説明しておこう。たとえば、Apache を自分の Cygwin のシェルから ``/usr/sbin/apachectl start´´として
起動してもいちおうは動作する。しかし、CGI プログラム
内で実行できないものが出てくるのである。
リスト 1 の CGI プログラム (test-socket.cgi) を Web
サーバーから実行できる場所に置き、Web ブラウザで対応
する URL を開いたとしよう。
その場合、本来なら www.yahoo.co.jp の内容が表示
されるはずである。しかし、Windows のサービスとして
動作していない Apache から起動された test-socket.cgi
は、www.yahoo.co.jp に接続するソケットを作れず、``IO
::Socket::INET: Operation not permitted´´と表示す
る。
ここで、test-socket.cgi を書いた経緯を説明しておこ
う。
当初、私は Cygwin 上の Apache を/usr/sbin/apach-
1. /etc/apache/httpd.conf に、
User Guest
という行を追加し、Apache が Guest ユーザーで動作
するように設定する。こうしないと、サービスとして起
動したあとですぐに終了してしまう。
2. Guest ユーザーが/var/log/apache ディレクトリと
そのなかのファイルに書き込めるようにする。具体的に
は、以下のコマンドを実行すればよいだろう。
chmod a+w /var/log/apache
chmod a+w /var/log/apache/*
ectl を使って自分のプロセスとして動かしていた。それで
も付属のサンプル CGI プログラムである/cgi-bin/print-
env や/cgi-bin/test-cgi は問題なく動作した。
しかし emailform の場合は、UNIX 上では問題なくメ
ールを送信できるのに、Cygwin 上では SMTP でのメー
ル送信に失敗してしまう。メールを送ろうとして失敗した
時点での$!(Perl の組込み関数に関係したエラーメッセー
ジが入る)を表示させてみると、 ``Operation not permitted´´となっている。Google から ``cygwin apache
”operation not permitted”´´というキーワードで検索し
てみたが、解決策はみつからなかった。そこで、メールサ
3. 以下のコマンドで Windows のサービスとして登録す
る。
cygrunsrv -I httpd -d "Cygwin httpd (apache)"⇒
-p /usr/sbin/httpd.exe -a -F
UNIX MAGAZINE 2005.2
責了 [perl0502.ps]
ーバーに接続するソケットの作成に失敗しているのではな
いかという仮説を立ててみた。
ソケットの動作を確かめる方法の 1 つは、ソケットでサ
ーバーに接続して要求を送り、想定どおりの応答が返って
149
連載/Perl活用のヒント —
15
●
リスト 1 test-socket.cgi
1
#!/usr/bin/perl -w
2
3
4
5
6
7
BEGIN {
local $| = 1;
open(STDERR, ">&STDOUT");
print "Content-Type: text/html\r\n\r\n";
}
8
9
10
use strict;
use IO::Socket;
11
12
13
14
15
16
17
18
19
20
21
22
my $s = IO::Socket::INET->new(Proto => "tcp",
PeerHost => "www.yahoo.co.jp",
PeerPort => 80) or do {
die "IO::Socket::INET: $!\n";
};
$s->print("GET / HTTP/1.0\r\n\r\n");
while ( <$s> ) {
last if ( /^\s*$/ );
}
print <$s>;
exit 0;
くるかを確認することである。この確認を HTTP でおこ
理は Perl のプログラムではありふれたものである。一方、
なうように書いたのが test-socket.cgi である。これはコ
HTML メールを SMTP でメールサーバーに送る処理は
マンド行から実行すると問題なく動作するが、CGI プログ
それほど一般的ではないので、この処理の基本を短いプロ
ラムとして Apache から実行すると、予想どおりソケット
グラムを例に説明しておこう。
で www.yahoo.co.jp へ接続することに失敗した。
そこで、もしかしたら関係があるのではと思い、Apache
リスト 2 に示すプログラム (test-mail.pl) は、SEND-
ER から RECIPIENT 宛のメールを SMTP で SMTP
を Windows のサービスに登録してから起動してみた。そ
SERVER へ送信する。これらの定数に適当な値を設定し
の後、test-socket.cgi を Web ブラウザから開いたとこ
て試してみてほしい。このプログラムでは Perl の配布フ
ろ、今度は www.yahoo.co.jp への接続に成功し、HTTP
ァイルに含まれていないモジュールを使っているため、以
応答も想定したものが返ってきた。
下のパッケージを CPAN1 などから入手してインストール
それでは、test-socket.cgi のコードを簡単に説明してお
こう。
• 3∼7 行目:エラー時のメッセージが Web ブラウザに
表示されるように設定する。
• 12∼16 行目:ソケットを www.yahoo.co.jp の TCP
80 番ポートに接続する。
• 17 行目:トップページの内容を返す HTTP 要求を送
信する。
• 18∼20 行目:www.yahoo.co.jp の応答からへッダを
取り除く。
HTML メールを SMTP で送る
emailform の処理内容のうち、HTML フォームの処
150
責了 [perl0502.ps]
する必要がある。
• MIME-Base64 のバージョン 3.03 以降
MIME-tools が使用している。Perl 5.8 には MIME::
Base64 が付属しているが、MIME-tools はそれより新
しいバージョンを使用するのでインストールしなければ
ならない。
• IO-stringy
MIME-tools が使用する。
• MailTools
MIME-tools が使用する。
• MIME-tools
MIME::Entity が含まれており、test-mail.pl が直接
1 http://www.cpan.org/
UNIX MAGAZINE 2005.2
連載/Perl活用のヒント —
15
●
リスト 2 test-mail.pl
1
#!/usr/bin/perl -w
2
3
4
5
use strict;
use MIME::Entity;
use Net::SMTP;
6
7
8
9
use constant SENDER => "himazu\@example.jp";
use constant RECIPIENT => "himazu\@example.jp";
use constant SMTP_SERVER => "localhost";
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
my $top = MIME::Entity->build(
Type
=> "multipart/mixed",
From
=> SENDER,
To
=> RECIPIENT,
Sender => SENDER,
Subject => ’test’,
);
my $time = ‘date‘;
$top->attach(Type
=> "text/html; charset=euc-jp",
Encoding => "base64",
Data
=> <<END);
<html>
<head>
<title>test</title>
</head>
<body>
$time
</body>
</html>
END
$ENV{MAILADDRESS} = SENDER;
my $smtp = Net::SMTP->new(SMTP_SERVER);
my @r = $top->smtpsend(Host => $smtp, MailFrom => SENDER);
if ( @r ) {
print "result:\n", join("\n", @r), "\n";
}
else {
print "$!\n";
}
$smtp->quit;
exit 0;
利用するパッケージである。
それでは、test-mail.pl を簡単に説明しておこう。
• 11∼17 行目:送信するメールのデータになる MIME
::Entity オブジェクトを作成する。test-mail.pl が送
信するメールには添付ファイルがないので ``multipart
様の方法でファイルを追加すればよい。
• 32 行目:メールサーバーへの SMTP 接続を Net::
SMTP オブジェクトを作成することで実行している。
• 33 行目:Net::SMTP オブジェクトを使用し、MIME::
Entity オブジェクトのデータを送信している。戻り値
は送信に成功した宛先アドレスのリストになる。
/mixed´´は不要だが、emailform では必要なのであえ
てこのように設定している。
• 19∼30 行目:HTML データを MIME::Entity オブジ
ェクトに追加している。添付ファイルがある場合は、同
UNIX MAGAZINE 2005.2
責了 [perl0502.ps]
なお、test-mail.pl は SMTP 認証をおこなわない。組
織内のメールサーバーは通常は SMTP 認証をおこなわな
いので、これでも問題はないだろう。
151
連載/Perl活用のヒント —
15
●
私は test-mail.pl が想定どおりに動作することを確か
めたあとで、念のために CGI プログラムとしても正しく
[smtp]
accept=localhost:25
connect=secure.smtp.server :port
動作するかを確認してみることにした。
test-mail.pl は、そのままでは CGI プログラムとして
という内容のファイル smtp.stunnel を用意したうえで、
は不十分である。ファイル名が test-mail.pl のままでも、
stunnel を ``stunnel smtp.stunnel´´のように起動すれば
cgi-bin ディレクトリの下に置けば Web サーバーから起
よい。
動される。しかし、CGI プログラムが出力すべき HTTP
その後、localhost を SMTP サーバーに指定すれば、メ
応答へッダを出さないので、Web サーバーからは正常に動
ールをサーバー secure.smtp.server の port 番ポートに
作していないと認識され、Web ブラウザで test-mail.pl
SSL/TLS で送信できる。もちろん、SMTP 認証もおこ
の出力を見ることができない。CGI プログラムとしての
なえる。
動作を確認するには、test-mail.pl の 2 行目と 3 行目の
あいだに test-socket.cgi の 3∼7 行目を挿入すればよい。
それで CGI プログラムとして動作するだろう。
SMTP 認証
emailform は組織内での使用を前提にしているので、メ
ール送信の際に SMTP 認証をおこなわない。一方、イ
ンターネット上のメールサーバーにメールを送る場合は、
SMTP でメールを送信する意義
プログラムからメールを送信する場合、SMTP でサ
ーバーへ送信する代わりに MTA (Message Transfer
Agent) プログラムを起動してメールのデータを渡すこと
も考えられる。実際のところ、以前はそのほうが一般的だ
った。
具体的には、/usr/lib/sendmail を起動し、その標準入
SMTP 認証が必要なことがある。SMTP 認証をおこな
力にメールのデータを渡すのである。以前は sendmail が
うように test-mail.pl を変更するのは簡単なので、ここに
UNIX の MTA の代名詞であり、UNIX 系 OS ならかな
紹介しておこう。プログラムの変更は、32 行目と 33 行目
らず備えているうえに設定もされていたので、この方法に
のあいだに以下の記述を挿入するだけである。
は十分一般性があった。
$smtp->auth(ユーザー名, パスワード);
ところが、最近は sendmail 以外の MTA が使われる
ことが多いだけでなく、MTA プログラムが動作する設定
ただし、auth メソッドのなかで標準では提供されて
になっていない場合もある。また、MTA プログラムを起
いない Authen::SASL モジュールを使用しているので、
動するより、SMTP サーバーに TCP で接続して SMTP
CPAN などから Authen-SASL パッケージを入手してイ
でメールを送信したほうが効率的だという事情もある。
ンストールする必要がある。
SMTP サーバーへの SSL/TLS 送信
したがって、現在ではプログラムからメールを送信する
方法としては、MTA プログラムを起動するより SMTP
を使ったほうが好ましいと思う。
☆
インターネット上の SMTP サーバーのなかには、SSL/
TLS2 で暗号化された通信をおこなうものがある。Net::
今回は、emailform の概要と実行環境の整備、基礎と
SMTP 自体は SSL/TLS による通信をサポートしていな
なる SMTP でのメール送信について説明した。次回は、
いが、必要であれば stunnel を使い、Perl プログラムでこ
emailform のより詳しい動作と、コードの説明をおこなう
の通信をおこなうことができる。クライアント側の stun-
予定である。
nel の設定はいたって簡単で、たとえば、
(いまづ・ひでよ モルガン・スタンレー証券)
2 以前は SSL (Secure Sockets Layer) と呼ばれていたが、最近では正
式に TLS (Transport Layer Security) と呼ばれるようになった。
しかし、依然として SSL という呼び方もよく使われているので、この記事
では SSL/TLS と表記する。
152
責了 [perl0502.ps]
UNIX MAGAZINE 2005.2
広告にみる UNIX
09
08
ソニー/ NWS-700、NWS-800、NWS-900
CTC / Sun Sun3、Sun4/200
11
10
Apollo Computer / DSP10000
ビクター・データ・システムズ/ V4W
▶1987 年10 月号
なりました。
08
ソニーの新しい
NEWS シリーズが発表され、その
▶1988 年 7月号
見開き広告が価格とともに掲載されています。私がおも
10
見開きで、Apollo
Computer の DSP10000 とい
に使っていた NWS-841 は、CPU が 16MHz の 68020、
うシステムが載っています。CPU は PRISM というオリ
8MB のメモリ、286MB のハードディスクという構成で
ジナルの RISC アーキテクチャで、OS もオリジナルの
標準価格 295 万円、いっしょに使っていたモノクロの縦
Domain/OS です。それ以前の製品には、CPU に 68000
型ディスプレイ(816 × 1024 ドット)は標準価格 35 万
シリーズを使った DN100 や DN3000 というワークステー
円だったようです。いまだとかなり豪華なサーバーが何台
ションがあり、OS はオリジナルの AEGIS、ネットワー
も買えてしまいます。
クも初期のころはトークンリングとオリジナルのネット
▶1988 年 3 月号
ワーク・プロトコルという、先進的ではあるものの、癖の
68020
を 使 っ た Sun3 シ リ ー ズ と と と も に、
09
強いシステムでした。AEGIS は、米国の戦闘艦に搭載さ
SPARC CPU を使った Sun4/200 の広告が掲載されてい
れている艦隊防空システム「イージス」と同じで「盾」と
ます。このころから、おもな UNIX システムの CPU が、
いう意味です。
それまでよく使われてきた Motolora の 68020 などの
DN シリーズの発売後、UNIX や Ethernet、TCP/IP
CISC から RISC ベースの CPU へと変わっていくように
が主流になるにつれて、それらも採り入れられていきまし
155
UNIXcla_137_168.indd 19
07.8.26 11:48:51 AM
広告にみる UNIX
▶1988 年10 月号
14
HP9000
の 300 シリーズの CPU は 68020/68030、800 シリーズのほうは
PA-RISC という HP オリジナルの RISC CPU を使っていました。OS はいずれ
も HP-UX です( ☞1 9 9 8 年 1 0 月号)
。
このシリーズは CAD/CAM ソフトウェア市場でよく使われ、広告にある画
面写真もほとんとが CAD/CAM アプリケーションであることからも、それが
わかります。
この広告主は HP ではなく、横河電機と HP の合弁である YHP(横河・ヒュー
レット・パッカード)です。1995 年に日本ヒューレット・パッカードに改称し
たあと、1999 年に横河電機との合弁を解消し、米国 HP の 100%子会社となり
ました。
このとき、
計測器機部門はアジレント・テクノロジーとして独立しました。
▶1988 年11月号
15
噂の(といっても
20 年近く前ですが)モデム Telebit の TrailBlazer
T2000 です。実質最高スピード 14Kbps と「超高速」でした。ただ、広告に
は低価格で登場とありますが、価格が
15 スワイヤトランステック/
Telebit TrailBlazer T2000
198,000 円とかなり高く、JUNET に多く
のサイトを接続できるようにしたくても
なかなかできませんでした。またモデム
を接続するホストのほうも、T2000 を 4
台接続して同時に通信させるとかなり苦
しくなる時代でした。
▶1989 年 4 月号
DECstation
3100 は、CPU が
16
MIPS の R2000、OS は 4.3BSD ベ ー ス
の ULTRIX でした。DEC は長いあいだ
VAX ベースの CPU を使い、VMS をメ
インの OS としてきましたが、広告にある
「UNIX のリーディング・ベンダー DEC か
ら」という言葉に DEC の方向転換が感じ
16
DEC / DECstation 3100
られます。DECstation がやってきた日の
ことを思い出します( ☞1 9 8 9 年 1 1 月号)
。
▶1989 年 9 月号
17
Sun
の SPARCstation 1 は、それ
までの Sun4/110 や 260 のような巨大な
筐体から一転、ピザボックスと呼ばれるピ
ザの箱程度の筐体に収められ、とても衝
撃的でした。勤務先でもさっそく導入し
ています。ただ、小さな筐体に収容する
ために、初期の 3.5 インチのハードディス
クを使っていたため、容量が小さくて遅
かったのが残念でした。そのあたりのこ
とを連載でもすこし触れました( ☞1 9 9 0
年 3 月号)
。
17 Sun / SPARCstation 1
157
UNIXcla_137_168.indd 21
07.8.26 11:49:10 AM
ソースコードから実行ファイルができるまで
コードが出力されていないか確認してみるとよいでしょう。
プリプロセスの場合と同様、アセンブラの出力もそのま
as -o オブジェクト・ファイル アセンブリ言語コード・
ファイル
ま次の処理へ引き継がれるため、目に見えるかたちで残さ
を実行するか、
れるとはかぎりません。
gcc -c
アセンブリ言語コードを明示的に出力させるには、次の
ようなコマンドを実行してください。
gcc -S
ソースファイル
アセンブリ言語コード・ファイル
を実行してください。これによってオブジェクト・ファイ
ルが作られます。
ライブラリ
アセンブル
アセンブリ言語コードはアセンブラによりマシン語で記
オブジェクト・コードは、ライブラリと結合されて実行
述されたオブジェクト・コードに変換されます。コンパイ
ファイルになり、そこではじめてプログラムとして動くよ
ラは通常、プリプロセスからアセンブルまでの処理を自動
うになることをすでにお話ししました。
的におこなうので、ユーザーが明示的にアセンブラを呼び
このような説明をすると、ライブラリが特別なものに思
出す必要はありません。
えるかもしれませんが、実体は普通のオブジェクト・コー
しかし、速度性能アップのためにアセンブリ言語で書い
ドとそれほど違いません。違う点といえば、ライブラリに
たコードを使いたい場合や、
“gcc -S”で得たアセンブリ
含まれる多くのコードを簡単にリンカが探し出せるような
言語コードをオブジェクト・ファイルにしたい場合には、
ファイル形式になっていることです。
アセンブラを直接呼び出してオブジェクト・ファイルに変
そもそもライブラリとは頻繁に利用されるコードをあら
換することもできます。
かじめ準備したもので、プログラマーは自分用のライブラ
アセンブラの一般的なコマンドである as を呼び出して、
リを作ることもできます。リンクの仕組みに着目してライ
.file
"hello.c"
元のソースファイル名
.version "01.01"
gcc2_compiled.:
.section .rodata
.LC0:
.string "Hello, world!¥n"
.text
.align 4
.globl main
.type
main,@function
main:
pushl
%ebp
movl
%esp, %ebp
subl
$8, %esp
subl
$12, %esp
pushl
$.LC0
元のソースコードの main() 関数に対応
call
printf
addl
$16, %esp
movl
$0, %eax
leave
ret
.Lfe1:
.size
main,.Lfe1-main
.ident
"GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-81)"
図 5 アセンブリ言語コード(hello.s)
30
UNIX MAGAZINE CLASSIC
UNIXcla_003_066.indd 28
07.8.26 11:01:47 AM
つくる—ソフトウェア開発とUNIX
ブラリを分類すると、
◦
スタティック・ライブラリ
◦
共有ライブラリ
コードすべてが実行ファイルに含まれます。そのため、あ
とで説明するダイナミック・リンクのように、
「実行時にライブラリがみつからなくてエラーになる」
の 2 種類があります。スタティック・ライブラリはリンク
といったことはありません。しかし、ダイナミック・リン
時に結合され、実行ファイル中にライブラリコードが埋め
クに比べて作られた実行ファイルのサイズは大きくなって
込まれます。
しまいます。
これに対して、共有ライブラリの場合、リンク時にはど
のライブラリコードを使うのかだけが実行ファイル中に記
スタティック・ライブラリを作る
録されます。実際にライブラリコードが結合されるのはプ
開発環境にはもともと C 言語用のライブラリがいくつ
ログラムの実行時です。
か付属していますが、ar コマンドを使ってプログラマー
スタティック・ライブラリ
最初に広く利用されるようになったライブラリは、スタ
ティック・ライブラリでした。スタティック・ライブラリ
というより、アーカイブ・ライブラリという呼び方のほう
が独自のスタティック・ライブラリを作ることもできます。
たとえば、3 つのオブジェクト・ファイル、
◦
file1.o
◦
file2.o
◦
file3.o
が馴染み深いかもしれません。このライブラリは名前が表
をまとめたスタティック・ライブラリ libfiles.a は、次の
しているように、複数のオブジェクト・ファイルを 1 つ
コマンドで作れます。
のファイルにアーカイブ(保管)したものです。リンク時
には、ライブラリから必要なオブジェクト・ファイルを取
ar -cr libfiles.a file1.o file2.o file3.o
り出してきて結合するだけなので、技術的には複数のオブ
さて、
できたスタティック・ライブラリの中身はどうなっ
ジェクト・ファイルのリンク処理と大差ありません。
ているでしょうか?
図 6 は、ソースファイルをコンパイルしてできたオブ
ジェクト・ファイルと、スタティック・ライブラリをリン
クする様子です。
1. オブジェクト・ファイルのなかに未解決の参照(関数
などの呼出し)がみつかると、
2. ライブラリを調べてその関数が定義されているオブ
ジェクト・ファイルを探します
file1
コンパイル
コンパイラ
4. これらのオブジェクト・ファイルをライブラリから抜
き出して実行ファイル中に埋め込みます
このように、スタティック・ライブラリから必要なオブ
file2
file3
オブジェクト・ファイル
3. 目的のオブジェクト・ファイル(図 6 の例では file1
と file3)がみつかると、
スタティック・ライブラリ
ソースファイル
リンカ
実行ファイル
リンク
オブジェクト・ファイル
file1
file3
ジェクト・コードを集めてリンクする方式をスタティック・
リンクと呼びます。
スタティック・リンクでは、プログラムの実行に必要な
図 6 スタティック・ライブラリとのリンク
31
UNIXcla_003_066.indd 29
07.8.26 11:01:47 AM
ソースコードから実行ファイルができるまで
図 7 は libfiles.a の構造を示したものです。ファイルの
先頭にはファイルの種類を示すマジックナンバー、続けて
インデックス情報、最後に 3 つのオブジェクト・ファイル
に関するデータ(file1、file2、file3)が並んでいます。
インデックス情報は関数が定義されている場所を示した
索引で、リンクされる関数を効率よく探し出せるように
なっています。
ライブラリ中のオブジェクト・ファイルは、
◦
オブジェクト・ファイルの情報を示すヘッダ部分
◦
オブジェクト・ファイルの内容を含む本体部分
そんなときは nm コマンドの出番です。
nm -s ライブラリ
を実行すれば、
◦
ライブラリに含まれるオブジェクト・ファイル名
◦
定義されていたり、参照されている関数名や変数名
◦
インデックスされている関数名など
を表示できます。
次ページの図 8 は libfiles.a に対して“nm -s”を実行
した結果で、
“Archive index”に続くパートがインデッ
に分かれていて、ヘッダ部分には元のオブジェクト・ファ
クス情報です。このパートがあるかどうかでインデックス
イルに関する、
情報が作られているかどうかを判断できます。
◦
ファイル名
◦
日付
◦
ファイルサイズ
nm コマンドはライブラリに対してだけでなく、通常の
オブジェクト・ファイルで定義されている関数名の表示に
も威力を発揮します。
nm オブジェクト・ファイル
などの情報が含まれています。
スタティック・ライブラリのインデックス情報
もぜひ試してみてください。
世の中の流れとして ranlib は不要のものとなりつつあ
インデックス情報はいまでは ar が自動的に作成するこ
りますが、古い Makefile や autoconf/automake を使っ
とが多いのですが、昔はユーザーが手で作成するというお
て Makefile を生成する環境では、ranlib を利用する設定
作法でした。もしインデックス情報が作成されない環境を
が生き残っているため、コマンドそのものをなくしてしま
使っているなら、ranlib コマンドを使って、
うのはなかなか難しいようです。
いったんは OS から ranlib コマンドを外したものの、
ranlib libfiles.a
あれこれと不都合が発生したあとに、再び「何もしないコ
でインデックス情報を作成してください。
「でも、ライブラリにインデックス情報が入っているか
どうか分からないんだけどぉ」
マンド」として復活させたケースもあります。
共有ライブラリ
スタティック・ライブラリに相対するライブラリとして、
共有ライブラリがあります。
「共有」という名前が物語っ
スタティック・ライブラリ(libfiles.a)
ているように、複数の実行モジュールでライブラリコード
マジックナンバー
インデックス
file1
file2
file3
file1.oの情報(ヘッダ)
file1.oの内容(本体)
を共有できる仕組みですが、
「プログラムの実行時にリン
クされる方式」という説明のほうがスタティック・ライブ
ラリとの違いが明確でしょう。
共有ライブラリは、スタティック・ライブラリよりも技
術的な面では複雑ですが、
図 7 スタティック・ライブラリの構造
32
UNIX MAGAZINE CLASSIC
UNIXcla_003_066.indd 30
07.8.26 11:01:48 AM
つくる—ソフトウェア開発とUNIX
◦
◦
実行ファイルのサイズを小さくできる
メモリ上に読み込まれた実行ファイルのコードから呼び出
ライブラリにバグが見つかったときに、実行ファイルを
コンパイルし直さなくてもライブラリの入れ替えだけで
されるかたちでメモリ上に読み込まれます。
対応できる
ダイナミック・リンク
などの利点が導入を後押ししました。
共有ライブラリが実際にオブジェクト・コードと結合さ
さらに OS がバージョンアップしたときの互換性維持に
れるのはプログラムの実行時ですが、このようなリンク方
も共有ライブラリが一役買いました。古い OS 用と新しい
式をダイナミック・リンクと呼びます。ダイナミック・リ
OS用にそれぞれ共有ライブラリを用意することによって、
ンク方式をさらに細かく分類すると、
どちらの OS でコンパイルしたプログラムでも動作するよ
うにしたのです。このような経緯から、実行ファイルを作
るときには標準で共有ライブラリが使われるようになって
いきました。
次ページの図 9 に共有ライブラリの仕組みを示しまし
1. ロードするライブラリや関数がプログラムのリンク時
に決まる
2. ロードするライブラリや関数はプログラムが実行時に
決める
た。共有ライブラリのコードは実行ファイル中に埋め込ま
の 2 種類があります。
れることはありません。その代わり、
「ライブラリ××を
コンパイル時に特別な指定をしない場合、共有ライブラ
実行時にロードする」という情報がリンク時に実行ファイ
リが存在すれば、オブジェクト・ファイルは共有ライブ
ルに記録されます。
ラリとリンクされます。このときのリンク方式は 1. の方
いざプログラムを実行する段階になると、実行ファイル
式です。たとえば、C の標準ライブラリで定義されている
中に書かれた情報を基にして共有ライブラリのコードがメ
printf() 関数をソースコード中で使っていると、1. の方式
モリ上にロードされます。このとき共有ライブラリのコー
で libc ライブラリがリンクされます。
ドは、
ディスク上の実行ファイルに追加されるのではなく、
2. の方式では、ロードするライブラリや呼び出す関数を
$ nm -s libfiles.a
Archive index:
_function1 in file1.o
_function2 in file2.o
_function3 in file3.o
file1.o:
00000000
00000000
00000000
00000000
0000000c
b
d
t
t
T
U
U
00000000 t
.bss
.data
.text
___gnu_compiled_c
_function1
_function2
_printf
gcc2_compiled.
インデックス情報
file1.o で定義している関数など
file2.o:
・
・
・
・
図 8 nm コマンドの実行結果
33
UNIXcla_003_066.indd 31
07.8.26 11:01:48 AM
温故知新なき成長
図1 1967 〜 2007 年のコンピュータ・メーカーのシェア推移
A.I. の夢のあと
1967年
図 2 には、
ソリューション系といっしょに A.I.
(Artificial
Intelligence)系の機器についても書き込んであります。
Burroughs 2%
NCR 2%
RCA 3%
CDC 3%
Other 2%
GE 4%
これらはワークステーションにも分類できますが、母体
IBM 73%
Honeywell 5%
Univac 6%
となった会社の姿はすでになく、A.I. はソフトウェア・ソ
サーバー
2000年
リューションとして存続しているものと見えます。
Other 24%
映画「ジュラシック・パーク」にも登場した Thinking
PC
Compac 27%
Compac 13%
Dell 11%
Sun 7%
Machines は、表示パネルが LED だらけの専用マシンで
HP 8%
HP 11%
したが、Oracle に吸収されてもはや姿はありません。
IBM 16%
Dell 15%
2004年
Lisp マ シ ン の メ ー カ ー と し て こ の 分 野 で 有 名 な
Symbolics 社は、インターネットの .COM ドメインの第
Other 61%
Other 57%
IBM 11%
HP 21%
IBM 7%
Dell 16%
HP 15%
Other 47%
1 号となったことでも知られています。その Symbolics.
com ドメイン自体はいまも存命で、少数のメンバーによっ
2007年
て Lisp 系処理ソフトウェアの販売が続けられています。
IBM 5%
Dell 8%
Sun 8%
Fujitsu 5%
HP 29%
Other 14%
ACER 3% Fujitsu 4%
Other 48%
Fujitsu 6%
A.I. の研究がさかんであったためか、これら A.I. 系専用
HP 19%
Dell 15%
Sun 11%
マシンは MIT 周辺で生まれ育ちましたが、時すでに専用
Dell 11%
IBM 29%
ハードウェアを使う時代ではありません。
Toshiba 4%
Lenovo 7%
ACER 7%
lenovo
IBM
1911
Burroughs
2004
1886
1952
Univac
1933
RCA
1919
Honeywell
GE
1953
1955
メンテナンス
(顧客)
を引き継ぐ
1971
1960’
1927
Honeywell Information Systems
1970
1964
1957
1876
Nixdorf
Simens
1952
Amdahl
NCR
Winca Nixdorf
Pyramid Technology
1954
1911
1985
AT&T
1957
Control Data Corporation
ソリューション
1998
FujitsuSimens
1995
1999
AT&T GIS
1991
1957
British Telecom
1997
CDS(SIに)
1999
NCR
1977
Oracle
1982
Thinking Machines
1986
Kendall Square Research
下線は白雪姫と
七人の小人
(1+7社)
Symbolics
1950
2000
1990
1950
Bull HN
NEC
1970
1935
Fujitsu
1991
Bull
1960’
フランス Machine Bull
イタリア Olivetti
1847
Unisys
1988
1955
1960
1965
1970
1975
1999
1993
1980
A.I.
1995
1981
1985
1990
1995
2000
2005
図 2 ソリューション系企業の変遷
139
UNIXcla_137_168.indd 3
07.8.26 11:47:58 AM
ソースコードから実行ファイルができるまで
1. の方式よりも柔軟に制御できるようになり、プログラム
的に指定できます。この場合も、コンパイルやリンクの方
1. オブジェクト・ファイルを位置非依存コード(position
independent code)として作る
2. リンカで共有ライブラリを作る
法が 1. の方式と違うわけではありません。
「位置非依存コード」という表現は日本語にするとしっ
たとえば、日本語 OS 上では日本語のメッセージを表示
くりこないのですが、要するに、
は dlopen() 関数を利用してロードするライブラリを明示
し、英語 OS 上では英語のメッセージを表示するようなプ
ログラムを作りたい場合、
◦
「プログラムの実行時にメモリ上のどの番地(アドレス)
へロードしても大丈夫なコード」
メッセージを表示する関数を言語ごとに異なる共有ライ
ブラリとして用意する
◦
プログラムの初期化コードで OS の言語の種類を調べる
◦
dlopen() を利用して必要な共有ライブラリをロードする
のような操作を 2. の方式を利用して実現できます。
という意味です。
これ と似 て いる「 再 配 置 可 能コード(relocatable
code)
」という用語もありますが、こちらはリンク前の段階
でアドレス情報が(番地ではなく)シンボルで表現されて
いる、という意味なので混同しないよう注意してください。
位置非依存のオブジェクト・ファイルを作る方法はコン
共有ライブラリを作る
パイラによって異なります。gcc では次のように“-fPIC”
共有ライブラリについて理解したところで、共有ライブ
オプションを指定してオブジェクト・ファイルを作ってく
ラリの作り方を簡単に紹介しておきましょう。ここでは、
ださい。
3 つのオブジェクト・ファイル、file1.o、file2.o、file3.o を
まとめた共有ファイル libfiles.so.1.0 を作ることにします。
おおまかな手順は次のとおりです。
gcc -fPIC -c file1.c
位置非依存のオブジェクト・ファイルから共有ライブラ
ソースファイル
共有ライブラリ
library1
コンパイル
コンパイラ
library2
library3
オブジェクト・ファイル
リンカ
リンク
オブジェクト・ファイル
ロード
(ダイナミック・リンク)
オブジェクト・ファイル
実行時にロード
library1
library3
library1
実行ファイル
メモリ上にロードされた
実行モジュールのイメージ
リンク時
library3
実行時
図 9 共有ライブラリを動的にリンクする
34
UNIX MAGAZINE CLASSIC
UNIXcla_003_066.indd 32
07.8.26 11:01:49 AM