昭和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
© Copyright 2024 Paperzz