図 1 プロセス ID をオ諚する FreeBSD% ps —lp 1 UID PID PPID CPU PRI NI 0 1 0 0 10 FreeBSD% 0 VSZ 528 RS S WCHAN wait 204 STAT ILs TT T IME C OMMAND 0 : 00 .80 /sbin/init ス ID が 1 番であるⅲ it プロセスの状態を詳しく知りた いときは、言田な情報を出力するための一 1 と、プロセス ID を指定する -p の 2 つのオプションを使います。 -p は引数をとるオプションなので、後ろにプロセス ID を指 定します ( 図 1 ) 。 プロセスの様子を調べる場合には、直接、そのプロセス の内部情報を得るか、カーネル内にあるそのプロセスに関 する情報を得ます。最初のガ去には間題があります。なぜ なら、プロセス内には、ユーザーが入力した平文のバスワ ードなど、重要な情報かイ尉寺されている可能生があるから です。そこでカーネル内の情報を用いるのですが、やはり そのなかにも重要な情報か数多く含まれているため、無制 限に情報を公開するわけにはいきません。 カーネル内の情報を取り出す方法にも間題があります。 以前の UNIX の ps コマンドは、カーネルの内容を直接調 べていました。 UNIX の言 t 者は、 ps コマンドのように カーネルの内部構造を利用するコマンドはそれはどないと 考え、あえて特別なシステムコールは設けませんでした。 そのため、 ps コマンドはカーネル内のデータ構造をその まま利用していました。しかし、カーネル内の構造はシス テムごとに異なるため、結果として ps コマンドはシステ ムに依存することになってしまいました。さらにカーネ ル内の情報を必要とするコマンドは ps 以外にも数多くあ り (uptime など ) 、これらもシステムに依存することに なってしまいました。 Sun Microsystems は、この間題を解決するために カーネル内のさまざまな情報にアクセスするためのライプ ラリを提供するガ去を導入しました。このライプラリ関数 を用いてアクセスするかぎり、カーネル内部の構造や情報 か変更された場合にも同しインターフェイスで辭長カ碍ら れるというわけです。これが、、 KVM ライプラリ " です。 fopen/fwrite などの高水準入出力ライプラリのように KVM ライブラリ 110 オープンしてディスクリプタを取得し、ディスクリプタ を用いて重清報を取り出し、最後にこのディスクリプタ をクローズするイ督はみになっています。 このライプラリによって互換性の間題は解決しました が、まだ別の問題が残っていました。カーネル内の情報 を取得するために、特別な権限が必要となるのです。従来 のプログラムでは、 setuid や setgid システムコールの機 能を用いて権限を取得し、カーネル内の情報を読み込んで いました。たしかに、これらの情報を必要とするのが ps コマンドのようなシステムのアプリケーションだけであれ ば、このガ去は有効かもしれません。しかし、ユーサーが 作成するアプリケーションでも、これらの清幸ゞ必にな ることもあります。このようなアプリケーションの作成や 変更のたびに、管理者に頼んで setuid を設定してもらう のは面倒です。 最近の BSD のシステムでは、 KVM ライプラリを提 供するだけでなく、このライプラリからカーネル内の情報 にアクセスする場合には、特別な権限はイ畯になっていま す。内部的には、プロセス情報を得るためのシステムコー ルを増やして、一殳のプロセスからカーネル内の情報を得 られるようにしています。 KVM ライプラリには次のような関数があります。 ・ kvm-open カーネル関連のファイルを指定し、 KVM ライプラリ のためのディスクリプタを得る。 ・ kvm-openfiles カーネル関連のファイルを指定し、 KVM ライプラリ のためのディスクリプタを得る。 ・ kvm—close オープンしたディスクリプタをクローズする。 ・ kvm-get pro cs プロセスに関する情報を得る。 ・ kvm-getargv プロセスのコマンド行引数に関する情報を得る。 ・ kvm-get envv UNIX MAGAZINE 2001.4
田淵責昭、末永洋樹、宮地利幸 ロ取 Up 臧 0 Linux 関連のソフトウェアの更新情報をお届けする。 からのおもな変史点は以下のとおりである。 Linux カーネル 2.4.2 が発表された。カーネル 2.4.1 Linux カーネル 2.4.2 Linux カーネルである。 これは AXIS 社のネットワーク・カメラ用に移植された 対応アーキテクチャとしては、 cris カ噺しく加わった。 ・ USB 関連のフィックス ・ドライバのアッフ。デート ・ ReiserFS のノヾグフィックス ・ S / 390 対応コードの修正 ・ドキュメントの追加と修正 ・ XFree86 3.3.6 X Servers ・ XFree86 4.0.2 ・カーネル 2.4.0 内容は以下のとおりである。 fisher) を公開した。 レッドハットは Red Hat Linux 7.0.9 ( コード名 Red Hat Linux 7.0.9 驀 Linux ティストリビューション ・ XMMS 1.2.4 ・ BIND 9.1.0 ・ GIMP 1.2.1 ・ glibc 2.2.1 ・ gcc 2.97- RH ・ rpm 4.0.2 ・ GNOME libs 1.2.8 ・ KDE 2.1 べータリリース・スナップショット UNIX MAGAZINE 2001.4 テクチャである。 る。 IA64 は lntel の ltanium でイ目されているアーキ 特徴としては、 IA64 をサポートしたことが挙げられ Meister Linux Mandrake 7.2 レーサーファイプは、 Meister Linux Mandrake 7.2 を発売した。 Red Hat べースで、構成は以下のとおりで ある。 ・カーネル 2.2.17 ( 2.4 し尺 - 可育 ・ glibc 2.1.3 ・ XFree86 4.0.0 ( 3.3.6 も〕 4 尺・可自 ・ KDE 2.0.1 ・ GNOME 1.2 驀セキュリティ関連 BIND lnternet Software Consortium (ISC) によって BIND (Berkeley lnternet Name Domain) 4.9.8 と 8.2.3 がリリースされた。これは、 BIND に存在する 4 つのセキュリティ・ホールが CERT によって報告され たことに対し、バグフィックスというかたちでのリリー スである。 BIND は多くの UNIX 系 OS ーーヒで重川乍する DNS サ ーバーの実装であり、インターネット上の多くの DNS サーバーに用いられているソフトウェアである。 CERT の文書によると、これらのセキュリティ・ホー ルにより、 BIND を実行しているユーサーの権限で任意 のコードか実行されたり、 D 。 S のゾンビとして利用され る可能匪がある。 もし、まだ 4.9.8 以前または 8.2.3 以前のバージョン の BIND を利用しているならば、至急、対 ) 斉みのバー ジョンへのアップグレードが必要である。また、これら のセキュリティ・ホールは BIND 9. x には該当しないた め、 9.1 にアップグレードする去も有効である。 このところ、 BIND などサー ・アプリケーション のセキュリティ・ホールを狙った攻撃がたいへん多いの で、 BIND 以タ ) サーバー・アプリケーションについて も、べンダー窈是供する情報を頻繁に石忍しておくことを お勧めする。 SSH 安全な通信を実現するために Telnet などに代わって 用いられている SSH に、セキュリティ・ホールがみつ 159
プログラミング・テクニック / 図 2 kvm kvm const char *swapfile , kvm—openfiles(const char *execfile, t * const char *swapfile , int ・ kvm-get err プロセスの環境変数に関する情報を得る。 kvm-open 関数と kvm-openfiles 関数 t * kvm_open(const Char *execfile, const Char *corefile, flags , const char *errstr) const Char *corefile, int flags , char *errbuf) KVM ライプラリ関数に関するエラーメッセージを得 る。 ・ kvm-getfiles UNIX MAGAZINE 2001.4 kvm-open は、 Sun カ甘是供した KVM ライプラリとの します。 し値を用いて、 corefile に対する書込みか言ムみかを指定 flags には、 open システムコールて寸旨定するものと同 ムが適当なファイルを尺してくれます。 これらのすべてに対して NULL を指定すると、システ 指定します。 ンプのどちらかです。 swapfile にはスワッフ。デバイスを か、 savecore により作成されたカーネルのクラッシュダ ネルのメモリイメージを指定します。通常は /dev/mem す。通常は /kernel などを指定します。 corefile にはカー 引数 execfile にはカーネルの実行イメージを指定しま なっています。 不頁の関数を使います。これらは、図 2 のようにすこし異 を取得するには、 kvm-open と kvm-openfiles という 2 ディスクリプタを引数としています。このディスクリプタ kvm-open と kvm-openfiles を除くすべての関数は、 カーネルのメモリ空間に書き込む。 kvm—write カーネルのメモリ空間を読み込む。 ・ kvm-read カーネルのシンポルテープルに関する情報を得る。 ・ kvm-nlist システムのスワップ領域に関する情報を得る。 kvm-getswapinfo システムのロードアベレージに関する情報を得る。 ・ kvm-getloadavg カーネルがオープンしているファイルの一覧を得る。 互換性のために用意されているものです。この関数を実行 中にエラーが発生した場合、 errstr が NULL であれは工 ラーメッセージに関する処理はおこなわれません。 errstr が NULL でない場合は、その内容が出力されたあとに工 ラーメッセージカ咄力されます。この出力は、もちろん標 準工ラー出力に対しておこなわれます。 しかし、この動作はライプラリ関数らしくありません。 というのは、ライプラリ関数はプログラマーの意図に反し て画面を乱す可能生があるため、関数自体はエラーメッセ ージを出力しないのです。 errstr を NULL にすれはよけ いなエラーメッセージを出力しないようにすることはでき ます。しかし、それではエラーに関する情報、つまり適切 なエラーメッセージか碍られなくなってしまいます。 これを角夬するために作られたのが kvm-openfiles 関 数です。この関数では、最後の引数の errbuf に文字酉改ー を指定しておき、エラーが発生した場合はそこにメッセー ジをオ絲タすることができます。ェラーメッセージを出力す る場合は、ここにオ褓内された情報をプログラム中で明示的 に出力すれはよいのです。 新しい KVM ライプラリでは、エラーメッセージは kvm-geterr 関数を経由して取得する決まりになってい ます。しかし、 kvm-openfiles 関数だけは特別に専用の 引数か設けられています。これには次のような意味があり ます。 kvm-geterr は、次のように使います。 char * kvm—geterr (kvm—t *kd) この関数は、指定したディスクリプタについて、もっ とも最近に発生したエラー情報を文字列の形式で返しま す。 kvm-geterr を使うには、引数としてディスクリプ タを指定する必要がありますが、 kvm-openfiles が失敗 した場合、ディスクリプタは取得できません。そのため、 kvm-geterr は利用できないのです。 111
いつでも使えるインターネット 写真 3 LAMB-RT-OI 一 4M2-2T ー 01 羊ルータ LAMB-RT-OI 」 ( 以ード、 LAMB) を紹介しま したファイアウォール構築例として、ワイルドラボの「子 Linux カーネルのバケット・フィルタリング機能を利用 特集の 4 ~ 6 回目 ( 2000 年 10 月号 ~ 12 月号 ) では、 ルータを別途用意する必要があります。 に接続する場合は、ファイアウォールを構築するための ます ) 。このため、これらの機器を用いてインターネット 時点ではこのような機能をもつ製品ははとんどないと思い 能はありません俐知らないだけかもしれませんが、現 の機器で、 ISDN ルータのようなフィルタリングなどの機 その名が示すとおり、データの変調と彳をおこなうため 接続事業者の回線に接続します。ところが、このモデムは ている場合は、ケープルモデムや xDSL モデムを使って インターネットへの接続に CATV や xDSL を利用し 子羊ルータ LAMB ・ DHCP をサポート ーションが必要 ・ファームウェアの更新には専用の Windows アプリケ ・ NAT と IP masquerade によるアドレス変換 送信可能 許可 / 拒否したバケットのログは syslog で他ホストに ・バケット・フィルタリング ( ただし、欠陥あり ) イスによる設定 ・ Web インターフェイスとコマンドライン・インターフェ ・ LAN 型接続と端末型接続をサポート 側は ISDN) ・ LAN 側に 4 つの 10BaseT インターフェイス (WAN を以下に示します。 ファイアウォール構築という点からみたこの製品ク寺徴 102 0 この製品には、以下のような特徴があります。 ・ LAN 側と WAN 側にそれぞれ 1 つの 10Base T イン ターフェイス ・ Linux カーネル 2.2.16 か動く超小型 PC 互換機 ・ Red Hat Linux をベースとする糸屯粋な Linux マシン ・ Web インターフェイスとコマンドライン・インターフェ イスによる設定 ・バケット・フィルタリング 許可 / 拒否したバケットのログは syslog で他ホストに 送信可能 ・ IP masquerade によるアドレス変換 ・ファームウェアの更新には別の PC が必要 ・ DHCP をサポート (PPPoE にも試丐剱勺に対応 ) LAMB は、デフォルトで独自のファイアウォール機 能をもっているため、それをそのまま利用することもでき ます。しかし、この特集では、ユーサーが自分で用意した Linux マシンを使ってファイアウォールを構築すること も想定し、あえて LAMB のファイアウォール機能を無 効にし、 Linux カーネルにフィルタルールを直接登録する ための ipchains コマンドを用いて設定するガ去を紹介し ました。さらに、 Linux カーネルがフィルタルールを適 用する重川乍と、 ipchains コマンドのオプションについて 角見しました。 ところが、せつかく勉強した ipchains の知識は、近い 将来に役立たすになりそうです ( 「昔は、 ipchains コマン ドで設定したもんだがねえ・・・・・・」と、蘊蓄を傾けることは できそうですか ) 。 「えー、そんなことがあってええんかいな。時間を返せ ! 」 と嘆きたくなるのもよく分かります ( せつかく書いたの ・・ ) 。しかし、旧いフィルタリング機能と置き換えら れた機能は、その嘆きを補ってあまりあるものです ( と期 待します ) 。 Linux カーネル 2.4. x では、 Netfilter という新しい フィルタリング・システムが実装されました。 リリース ノートを読んだかぎりでは、この NetfiIter はステートフ ル・インスペクションのような機能をもっているようで す。しかし、私自身はカーネル 2.4 を動かしたこともソー UNIX MAGAZINE 2001.4
ますが、たいへん重要な決まり文句です。 getuid システ ムコールはプロセスの実ューサー ID を返します。さらに setuid システムコールはプロセスの実ューザー ID と実効 ューサー ID を設定します。コードの実行前に 実ューサー ID = r 実効ューサー ID = e となっているとすると、 実ユーザー ID = r 実効ューサー ID = r このコードの実行後には、 となります。つまり、このコードは実効ユーザー ID を無 効にするのです。 前述したように、以前の ps コマンドは setgid の機能を 用いてカーネル内部の情報を取得できるようになっていま した。現在は、 KVM ライプラリや sysctl の整備によっ て setgid は不要になりましたが、以前のコードか残って いるのでしよう。このコードが原因でとくにイ諸に合カ起こ ることは考えられないので、残しておいても問題はありま せん。むしろ、描丘はセキュリティの面でいろいろと問題 が発生しているので、より安全な動作か期待できるコード を残しておくのはよいことです。 このあと、 kvm-openfiles を用いて KVM ライプラリ のディスクリプタを取得します。 kd = kvm—openfiles (nlistf , memf , swapf , O_RDONLY , errbuf) ; errbuf) ; こで kvm-openfiles の引数に注目します。さきほど のライプラリの説明では、 /kernel などの意味のあるファ イルを指定すると説明しましたが、デフォルトでは 3 つの 引数に / dev / 11u Ⅱを渡しています。 こんなことで動くのかと不安になるかもしれませんが、 大丈夫です。この場合、 KVM ライプラリは、可能なか ぎり特別な権限を必要としない sysctl を用いて情報を収 集します。現在のシステムでは、 ps コマンドに必喫な情 報はすべてこの方法で取得できます ( だからこそ setgid も不要になっています ) 。 KVM ライプラリでもこうい う面は考慮されていて、カーネルのメモリイメージとし て /dev/null か指定されてもよいように作られています ( 本来は /dev/mem かクラッシュダンプだけです ) 。逆 UNIX MAGAZINE 2001.4 プログラミング・テクニックー に、メモリイメージとして本来の /dev/mem を指定して しまうと、このファイルを読むための権限が必要になるの で、 KVM ライプラリがファイルをオープンできす、ェ ラーとなってしまいます ()M はメモリイメージを指定す るオプションです ) 。 FreeBSD% ps —M /dev/mem ps : /dev/mem : Permission denied KVM ライプラリのソースコードも調べてみました。イ メージファイルはかならすオープンしますが、これが保存 されたクラッシュダンプのファイルでなければカーネルの 実行イメージをオープンすることはありません。さらに、 スワッフ。テンヾイスにいたってはオープンする気配すらあり ません 1 。 次に、まだ出力用フォーマットカ甘旨定されていないので あれば、こでデフォルトのフォーマットを指定しておき NODEV & & pid uid = getuid() ; ui d (uid-t)-l) if ( ! a11 & & ttydev parsefmt (dfmt) ; if (!fmt) てすから、このインターフェイスに依存するプログラムは書かないように 1 もちろん、これは工第点での話であり、麦どう変わるかは分かりません。 り当てられたプロセスを、プロセス ID カ甘旨定されていれ サーのプロセスを、端末カ甘旨定されていればその端末に割 決定します。ューサー ID カ甘旨定されていればそのユー 次に、どんな不頁のプロセスに関する情報を得るのかを どを調べます。 する必要があるか、コマンド名寺する必要があるかな れの情報のフラグを検査することで、 user 構造体 &f 尉寺 この関数も ps. c ファイルで定義されています。それぞ scanvars() ; とカ甘旨定されているのかを十ヾます。 次の関数で、カーネルからどのような情報を取り出すこ 行したユーザーのプロセスを表示するためです。 ロセスに関する指定がなかったときに、 ps コマンドを実 uid によりューサー ID を取得します。これは、とくにプ さらに、ユーザーに関する情報が必要な場合には、 get- しましよう。 117
ワークステーションのおと一 O 、を t 0 に卩朝こ e Term-CCiM1 VT ~ 此印れ第面物 画面 6 コンソールが ttya になっている CAUTIO'I: After choosing Con 弋 i 上 , 弋 s t 記 8t0 」 t ard irv 」 t devices keyboard. ー t the desi red &vices and ℃ 0 C 代 i に . Specify a C86 output 証旧 i 「 0 」 t device ot 「仕 n the sc 「 een ard are immediately tO access t ト conso 尾 . [ ] sc 「 1 and keyEoard ttya ttyb ツ Lont Ⅲリをト 3 (.;ancei 9 起動前 噬 T 0 Term - t"J.)M1 し 7 t path: / öciO , 0 / pci - i 214 , 1 / i / cn 匐 , 0 : a くくく Current めそ Parameters 〉〉 > ト 6 H 引 0 土 args b Cf ile-name] CEmt-fIags] く ENTER> i く ENTER> く ENTER> くくく t i 弋 in 5 seconds > 》 T 3 Term ー COMI 、灯 Edit 学 C 一当加響わ 10 起始まる lect (b)oot or (i)nterprete 「 : to bcot with 弋 ior 心 弋 0 ot with defaults 弋 0 ぎ社 e 「 ot ⅲ弋 e 「 p 「 e e 「 画面 7 テパイスドライバの言△み 印ⅱ 1 叩 - C 壑市引物水解 当 T ョを口第 -COMI VT Loading Driver 猷 a. bef ー ease ; t 画面 8 起動テパイスの尺 は阯 , 叩 0 引′ 0 当を Term-COM1 、鷲 ) 00t So 「 〉 To rake a ーい uæ the a 「「 keys, 印 press Enter tO mark は CX]. asterisk は ) indicates t ト「「信リ日斌ⅵ ( e. sett ings, chcose Tasks. TO perform wt ion 引 features, s 廴ー as if ⅵ鷓 the autoOt and procerty choose Cont i 「 3. Select を of 仕総 identified ⅵ c to 斌 the SoIaris kernel and Board ー反 0 を at [Ev 10 : lntel Pr0100 Fast Et 「弋 Maste 「 ing ー c 価 0 Ⅱ e 「 Board ートぉ 0 , at 2 8. OG : Ta 「 get 0 : を AO 8-224E & ぉ s 「 i ー cmt 「 0 Ⅱ e 「 Board ー b.s 0 , at Dev 2 [ ] 田 : Ta 「 get 1 , TOSHIBA 1214G & Mastering ー圧 cm 土「 0 Ⅱ「 Board ートぉ 0 , at 2 田 : い ) Target 0 , TGHIBÅ 1214G くくく 0 」「「士弋 Parameters > > > t path: / pci , 0 / pci - i 014 , 1 / i / , 0 : a t args b Cf 日 e - r ] COt-fIags] く ENTER> i く ENTER> く ENTER> ype 士 0 ot with cpti 侊虐 土 0 と 0 with defaults to ente 「 ) 土 interprete 「 [ ] IET 2 (-:onti nue F3 8 ャ十 F4 Boot 信 4 ( s フォルトの起動デバイス ( 今回の例では、、 Target 0 , TO- UNIX MAGAZINE 2001.4 ます。ここで、 Sun のマシンにあった ROM モニターの F2 キーを押すと、今度は画面 9 のような表示に変わり ソルを動かし、スペースキーを押して X 印を付けます。 したハードディスクのところまで ( カーソルキーで ) カー こに X 印カ咐いていないときは、 SoIaris をインストール SHIBA MK1214GAP") か選ばれているはすです。 くくく t ⅳに 0 」 t in 5 seconds 》〉 尾 a 5.8 Version 肥「 ic 108529-03 32-bit ハードディスクのアクセスランフ。が点滅し、何かしてい 「うまいこといくやろか ( どきどき ) 」 れています ( 画面 10 ) 。 きました。画面には、カーネルの起動メッセージか表示さ これで、ようやく Solaris のカーネルの起動にたどり着 に起動力始まります。 起重丿けるかを選びます。何もせずに放っておくと、 5 秒後 ようなもの (boot interpreter) を起動するか、ただちに 「国 1983-2000 & 』 1 Microsystems, ー 8. ÅII 「 ights 「 ese 「 v . 141 ワーク経由でログインしようとしても、さつばり反応があ しかし、 5 分ほど待っても何も変わりません。ネット みよ」 「待ては海路の日和ありともいうしな、ちょっと待って り、ディスクの音も聞こえなくなってしまいました。 ところが、すこし経っとアクセスランフ。の点滅が止ま 「そうや、その調イ。ええがな、ええがな」 るようです。
連載 . /lnside Cygwin— 図 1 Cygwin と VMware のアーキテクチャの本田 Cygwin アプリケ ンヨン Cygwin アプリケ ンヨン Wi ndows アプリケ ンヨン NT カーネ丿レ NetBSD アプリケ ンヨン NetBSD アプリケ ンヨン Cygwin DLL Cygwin DLL Win32 サプシステム ーー 0 VMware 上の NetBSD では、 NetBSD のカーネル VMware VP ドライバ vp モニター ハードウェア アプリケーションの利 表 3 ubench の測定結果 Cygwin VMware 上 用する資源をカーネルがすべて掌握しているのに対して、 Cygwin DLL はそうではない。そのため Cygwin DLL では、システムコールのエミュレーションを最適化しづら くなっている。パス角夬 1 っとっても、 NetBSD なら一度 角夬したパス名はキャッシュできるのに対して、 Cygwin でははかのアプリケーションがファイルシステムに触って しまうので、そういうことはできない。 Windows の資源 を借りるときに、 VMware が NT カーネルを利用してい るのに対して、 Cygwin DLL は W ⅲ 32 サプシステムを 利用しているのもハンデになる。 したがって今回のべンチマークは、 Cygwin が遅いの 頭で述べた、℃ PU をぶん回すだけなら遅くない " こ とを ーク・ソフトウェアは前述の lmbench と、冒 ーク・ソフトウェア は当り前で、何がどれくらい遅いのかをみきわめることが / ヾンチ ~ べンチマ 目的になる。 UNIX MAGAZIN E 2001.4 7 http://www.phystech.com/download/ubench.html 化オプションとして一 03 のみを指定している。 lmbench をコンパイルする際には、すべての竟で最適 欠落していたので、 lmbench 2alpha10 から補っている。 このバージョンでは webpage-lm. tar というファイルが 回用いたバージョンは lmbench-2beta1 である。ただし、 の「 PC UNIX のべンチマーク」を参照してほしい。今 lmbench の詳細は、前述したように 1999 年 6 月号 lmbench 示すために ubench7 を用いた。 CPU メモリ ubench 37 , 532 23 , 872 30 , 702 の NetBSD 59 , 934 17 , 488 38 , 711 NetBSD 38 , 781 20 , 541 29 , 661 ubench は、 UNIX の CPU とメモリまわりの性能を 調員けるソフトウェアである。 CPU の性能を整数演算と 浮動小点演算を約 1 : 3 の割合で交ぜた引算で、メモリの 性能を malloc 、 memset 、 memcpy 、 free の適当な組合 せで則り、結果を独自のスコアで表小する。さらに、マル チプロセッサ竟の↑生能を測るために、プロセスを複数生 成して並列に負荷をかけるようになっている。 今回用いたバージョンは ubench-0.32 である。プロ セスを複数生成するガ去では、プロセス生成やコンテキス ト・スイッチのコストか言則結果に含まれてしまうので、 オプション (-s) を指定して単一プロセスで測定をおこな った。コンノヾイル・オプションは、 ubench が Linux 用 に用意している以下のオプションを、すべての竟でその まま用いている。 ー 02 —Wa11 —ma1ign—100ps=2 —ma1ign—jumps=2 —ma1ign—functions=2 —fomit—frame—pointer ubench の測定結果 ubench の測定結果を表 3 に示す。結果の数字は大きい ほどよい。 CPU をぶんぶん回すだけなら Cygwin 上でも 遅くはないという予測は、おおむね当たっている。 VMware 上の NetBSD の CPU のスコアが、 PC 上 133
所 ux を高速実行、 しかもテスク ! ′ 0 せ 0 新 加 ux - ティスクレス PC アジャイル・リドット Linux カーネルを ROM(Disk On Chip) 化。 本体内部にハードディスクを持たない ティスス設計 ! ! システム管理者はハードディスクの障害に畄ませられることなく、クライアントメンテナンスから解放され、シ ステムの TCO 削減に大きく貢献します。ディスクレスマシンでありながら、旧 t 引 Pentium Ⅲ、 CeIe 「 on プロ セッサを搭載し、通常の PC - Linux マシンと全く変わらない高速な演算処理を実現します。また、本体ユ二ッ トは PC アーキテクチャをベースにしているため、 CD-ROM ドライブ、 MO ドライブ、ビデオキャプチャボード 等のオプションを組み合わせることにより、マルチメディアコンテンツの実行にも大きな威力を発揮します。
if ((ioct1(STDOUT_FILENO, TIOCGWINSZ, (char *)&ws) ioctl (STDERR_FILENO , TIOCGWINSZ , (char *)&ws) ioct1(STDIN_FILENO, TIOCGWINSZ, else if 文の条件部がかなり複雑になっていて、これらはすべ termwidth = ws . ws_col termwidth = 79 ; WS . WS_COI = 0 ) 116 _PATH_DEVNULL ; swapf memf = nlistf いう値で衫琪月化されています。 つの変数です。これらはすべて -PATH-DEVNULL と こで注意してほしいのは、 memf 、 nlistf 、 swapf の 3 次は、オプションを解釈するための変数の初期化です。 関数を使って解釈できるようになります。 これらの変換により、旧い形式のオプションも getopt し、—p オフションに変換する。 か指定されていない場合にはプロセス ID 窈旨定とみな ・オプションの末尾か数字の並びであり、その前に t や p -T オプションに変換する。 ーで始まらないオプションで t で終っているときは、 ーて始まらないオプションの場合には、地寬こ - を付け この関数は、次の 3 つの処理をおこないます。 argv[l] = kludge—oldps—options(argv[l] ) ; if (argc > 1 ) 地直の引数に対して整をおこなっています。 うに、 kludge-oldps-options という長い名前の関数が、 す。このような場合にも正しくオプションか解釈できるよ ため、現在でも、 psaux " などとしてしまうことがありま ステムでは、かなり以前からこのような仕様となっていた ンを指定しなくてもよいものがありました。 BSD 系のシ 要がなかったり、プロセスを指定する際に -p オプショ い ps コマンドには、オプションを表す - を付ける必 次は、オプションを表す引数の言驩各をおこないます。旧 調べていき、イ勧碍られたところで else 節を実行します。 が真となった場合、後ろの節を実行します。前から順番に て & & で結はれています。つまり、前の節を実行して結果 このマクロは /usr/include/path. h ヘッダファイルで 定義されており、その値は /dev/null です。 このあと、 getopt 関数を使った引数の解釈か読きます。 オプションに関しては、さきほどの変換により、旧い形式 窈旨定でも正しく処理できるようになっているので簡単で す。しかし、旧い ps コマンドの場合、たんに引数を並べた ときに、それらをカーネルの実行イメージ、カーネルのメ モリイメージ、スワップテパイスと解釈するという規則も ありました。しかも、 1 つだけ指定されたら実行イメージ として、 2 つ指定されたら実行イメージとメモリイメージ として、 3 つ指定されたらさらにスワッフ。テンヾイスとして 解釈するのです。これを実現している部分が、 getopt の ためのループのすぐ後ろにあります。 #define BACKWARD_COMPATIBILITY #ifdef BACKWARD_COMPATIBILITY if (*argv) { nlistf if (* + + argv) { memf = *argv ; if (* + + argv) swapf = *argv ; #endif ps コマンドは、オプションと対応しない引数をとる ことはないので、引数が残っていればそれはこのための 引数であることカ竕かります。引数が残っているかぎり、 nlistf 、 memf 、 swapf に順番に代入していけはよいので す。 このコード全体が ifdef プロックになっていて、そ の直前で、対応するマクロ BACKWARD-COMPATI- BILITY が定義されているのもおもしろいですね。この 部分からは、作者の、、いつかはこれを使わないでいいよう にするぞ " という思メ朝ムみが感しられます。また、このよ うに明カ勺に互換生のためのコードの範囲カ甘旨定されてい ると、プログラムを読む場合にも理解しやすくなります。 次に続くコードも昔の名残りです。 if (dropgid) { setuid(getuid() ) ; setgid(getgid() ) ; UNIX MAGAZINE 2001.4 しています。このコードはまったく意味がなさそうにみえ グループ ID とユーザー ID を取得し、それを再度設定
・ VIS-TAB タブ文字も変換する。 ・ VI S-NL テ文字も変換する。 ・ VIS-WHITE 空白、タブ、予文字も変換する。つまり、 、、 VIS-SP ー VIS-TAB ー VIS-NL" と指定したときと同じ ・ VIS-SAFE 通常の文字に加え、ベル文字や予文字など、安全なも if ( (vis—env = malloc(strlen(k—>ki—env) if (k—>ki—env) はなく、環竟変数に対してもおこないます。 は M-C と表現されます。この処理は引数に対してだけで と指定されているので、制御文字 C ( C 、メタ文字 c VIS_TAB ー VIS_NL ー VIS_NOSLASH さきほどのソースコードでは、 のに関しては変換しない。 120 else 示します。 はこの幅の範囲内で、竟変数の値やコマンドの引数を表 幅よりも小さければ出力を標 ~ 勺な幅に設定します。あと を引けば、残っている桁数カ碍られます。それか剽勺な 数ですから、そこから自分自身のオ剽純勺な幅 (v->width) totwidth は、オ剽軸勺な出力をおこなった場合の本の桁 る場合は、あと何桁残っているのかを調べます。次の 後ろに出力する情報はないが出力幅が限定されてい vis—args) ; (void)printf ( "%s " vis_env) ; (void)printf ("%s if (vis—env) if (termwidth = = UNLIMITED) { / * last field * / if (ve—>next = = NULL) { てを出力します。 が無艮長となっている場合には、イ寺している 1 辭長のすべ 大きく変わります。ほか窈辭長を出力せす、端末窈旨定 実際の出力は、後ろにほかの情報を出力するかどうかで vis_env = NULL ; VIS_TAB ー VIS_NL ー VIS_NOSLASH) ; StrViS(ViS_env, k—>ki_env, err(), NULL) ; * 4 + 1 ) ) = = NULL) left = termwidth (totwidth ー v—>width) ; if (left く 1 ) / * already wrapped, Just use std width * / left = v—>vidth; 一方、後ろに出力する情報か有する場合には、オ剽勺 } else します。 ために使った vis-args や vis-env を解放して関数を終了 たく出力されません。あとは、出力用の文字列をイ尉寺する な幅を用いて出力します。その場合には、竟変数はまっ free(vis_env) ; if (vis—env ! = NULL) free(vis—args) ; v—>width , v—>width, vis_args) ; (void)printf ( " % ー * . *S" UNIX MAGAZINE 2001.4 ( たじみ・ひさかす ) もうすこし詳しくみていきます。 した。次回は、カーネル内の情報を取得するガ去について、 ドを見ながら、 bsearch や strvis などの関数も紹介しま 関数について説明しました。このほかに、 ps のソースコー いる、カーネル内の情報を扱うための KVM ライプラリ 今回は ps コマンドをとりあげ、その内部で用いられて ☆ におこなえるわけです。 り、どんなに長くても v->width までという指定が簡単 指定では、全ー柘 ) 文字数を表します。つまりこの指定によ 定しますが、文字列など浮重ル」、点数以外のフォーマット 占数の場合には、後ろの数値は小魏点以下の数字の数を指 文字列とでは、この意味はまったく異なります。 ~ ル」 のは浮動小魏点数のときが多いのですが、浮動小点数と であれば、、 % ー 10.10S " となります。こういった指定をする から値を取り込むという意味ですから、 v->width が 10 ださい。、、 % ー *. * s " となっています。この場合の * も引数 この printf 関数のフォーマット文字列にも注目してく